[rhq] Branch 'gwt' - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
New commits:
commit 96029cb050daaa619cf97053191df67aefc91955
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 01:19:18 2010 -0400
don't refresh title if the view hasn't been rendered yet
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java
index afd1f47..7bacb3b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/AbstractBundleWizard.java
@@ -58,7 +58,9 @@ public abstract class AbstractBundleWizard implements Wizard {
public void setSubtitle(String subtitle) {
this.subtitle = subtitle;
- this.view.refreshTitleLabelContents();
+ if (this.view != null) {
+ this.view.refreshTitleLabelContents();
+ }
}
public List<WizardStep> getSteps() {
14 years, 1 month
[rhq] Branch 'gwt' - 5 commits - modules/core modules/enterprise
by mazz
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java | 13 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java | 9 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java | 87 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java | 33 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java | 38 +++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java | 66 ++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java | 13 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java | 10 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java | 14 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 27 ++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 4
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 45 +++++
17 files changed, 255 insertions(+), 130 deletions(-)
New commits:
commit f799588e682c83802916a9cd8f117265402837d4
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 00:49:05 2010 -0400
get end-to-end bundle create wizard to work. still need to pretty up the upload file step, but this commit has end-to-end working with the ability to cancel at any point in the wizard
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
index 01e2598..c33e4d5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
@@ -18,6 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
+import java.util.HashMap;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import org.rhq.core.domain.bundle.BundleType;
@@ -38,6 +40,7 @@ public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
private String bundleDescription;
private String recipe;
private BundleVersion bundleVersion;
+ private HashMap<String, Boolean> allBundleFilesStatus; // bundle file names with their upload status (true=they were uploaded)
public BundleType getBundleType() {
return bundleType;
@@ -87,12 +90,20 @@ public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
this.bundleVersion = bv;
}
+ public HashMap<String, Boolean> getAllBundleFilesStatus() {
+ return allBundleFilesStatus;
+ }
+
+ public void setAllBundleFilesStatus(HashMap<String, Boolean> allBundleFilesStatus) {
+ this.allBundleFilesStatus = allBundleFilesStatus;
+ }
+
public void cancel() {
final BundleVersion bv = getBundleVersion();
if (bv != null) {
// the user must have created it already after verification step, delete it
BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
+ bundleServer.deleteBundleVersion(bv.getId(), true, new AsyncCallback<Void>() {
public void onSuccess(Void result) {
CoreGUI.getMessageCenter().notify(
new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
index e76dc7f..43f7407 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
@@ -32,6 +32,7 @@ public class BundleCreateWizard extends AbstractBundleCreateWizard {
steps.add(new BundleInfoStep(this));
steps.add(new BundleUploadRecipeStep(this));
steps.add(new BundleUploadDataStep(this));
+ steps.add(new BundleSummaryStep(this));
setSteps(steps);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
index 2bfc93d..58c4e66 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
@@ -38,6 +38,8 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* @author John Mazzitelli
@@ -128,6 +130,13 @@ public class BundleInfoStep implements WizardStep {
if (wizard.getBundleType() == null) {
bundleServer.getAllBundleTypes(new AsyncCallback<ArrayList<BundleType>>() {
public void onSuccess(ArrayList<BundleType> result) {
+ if (result == null || result.size() == 0) {
+ wizard.setBundleType(null);
+ CoreGUI.getMessageCenter().notify(
+ new Message("No bundle types are supported", Severity.Error));
+ return;
+ }
+
for (BundleType bundleType : result) {
knownBundleTypes.put(bundleType.getName(), bundleType);
if (wizard.getBundleType() == null) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
new file mode 100644
index 0000000..bddf61b
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleSummaryStep.java
@@ -0,0 +1,87 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.create;
+
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.TitleOrientation;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.TextAreaItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+
+import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
+
+/**
+ * @author John Mazzitelli
+ */
+public class BundleSummaryStep implements WizardStep {
+
+ private DynamicForm form;
+ private final AbstractBundleCreateWizard wizard;
+
+ public BundleSummaryStep(AbstractBundleCreateWizard bundleCreationWizard) {
+ this.wizard = bundleCreationWizard;
+ }
+
+ public Canvas getCanvas() {
+ TextItem nameTextItem;
+ TextItem versionTextItem;
+ TextAreaItem descriptionTextAreaItem;
+ TextItem bundleTypeTextItem;
+
+ form = new DynamicForm();
+ form.setPadding(20);
+ form.setWidth100();
+ form.setNumCols(2);
+
+ bundleTypeTextItem = new TextItem("bundleTypeItem", "Bundle Type");
+ bundleTypeTextItem.setValue(wizard.getBundleType().getName());
+ bundleTypeTextItem.setDisabled(true);
+ bundleTypeTextItem.setTitleAlign(Alignment.LEFT);
+
+ nameTextItem = new TextItem("name", "Name");
+ nameTextItem.setValue(wizard.getBundleName());
+ nameTextItem.setDisabled(true);
+ nameTextItem.setTitleAlign(Alignment.LEFT);
+
+ versionTextItem = new TextItem("version", "Version");
+ versionTextItem.setValue(wizard.getBundleVersionString());
+ versionTextItem.setDisabled(true);
+ versionTextItem.setTitleAlign(Alignment.LEFT);
+
+ descriptionTextAreaItem = new TextAreaItem("description", "Description");
+ descriptionTextAreaItem.setValue(wizard.getBundleDescription());
+ descriptionTextAreaItem.setDisabled(true);
+ descriptionTextAreaItem.setTitleOrientation(TitleOrientation.TOP);
+ descriptionTextAreaItem.setColSpan(2);
+ descriptionTextAreaItem.setWidth(300);
+
+ form.setItems(bundleTypeTextItem, nameTextItem, versionTextItem, descriptionTextAreaItem);
+
+ return form;
+ }
+
+ public boolean nextPage() {
+ return true; // this is the last page, we are done
+ }
+
+ public String getName() {
+ return "Summary";
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
index 2a6a7c5..793cd5a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java
@@ -46,7 +46,6 @@ public class BundleUploadDataStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
private DynamicForm form;
- private Map<String, Boolean> allFilesStatus;
public BundleUploadDataStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -63,14 +62,12 @@ public class BundleUploadDataStep implements WizardStep {
new AsyncCallback<HashMap<String, Boolean>>() {
public void onSuccess(HashMap<String, Boolean> result) {
- allFilesStatus = result;
+ wizard.setAllBundleFilesStatus(result);
prepareForm(layout);
- enableNextButtonWhenAppropriate();
}
public void onFailure(Throwable caught) {
- allFilesStatus = null;
- enableNextButtonWhenAppropriate();
+ wizard.setAllBundleFilesStatus(null);
CoreGUI.getErrorHandler().handleError("Cannot obtain bundle file information from server", caught);
}
});
@@ -80,33 +77,33 @@ public class BundleUploadDataStep implements WizardStep {
}
public boolean nextPage() {
- return true; // TODO: Implement this method.
+ return isFinished();
}
public String getName() {
return "Upload Bundle Files";
}
- public boolean isNextEnabled() {
- if (this.allFilesStatus == null) {
+ private boolean isFinished() {
+ if (wizard.getAllBundleFilesStatus() == null) {
return false;
}
- if (this.allFilesStatus.containsValue(Boolean.FALSE)) {
+ if (wizard.getAllBundleFilesStatus().containsValue(Boolean.FALSE)) {
return false;
}
return true;
}
- public boolean isPreviousEnabled() {
- return true;
- }
+ private void prepareForm(VLayout layout) {
+ // if there are no files to upload, immediately skip this step
+ final HashMap<String, Boolean> allFilesStatus = wizard.getAllBundleFilesStatus();
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
+ if (allFilesStatus != null && allFilesStatus.size() == 0) {
+ // TODO: do something to tell the user they don't have to do anything for this step
+ return;
+ }
- private void prepareForm(VLayout layout) {
- for (Map.Entry<String, Boolean> entry : this.allFilesStatus.entrySet()) {
+ for (Map.Entry<String, Boolean> entry : allFilesStatus.entrySet()) {
HLayout formLayout = new HLayout();
layout.addMember(formLayout);
@@ -133,7 +130,6 @@ public class BundleUploadDataStep implements WizardStep {
CoreGUI.getMessageCenter().notify(
new Message("Failed to upload bundle file", results, Message.Severity.Error));
}
- enableNextButtonWhenAppropriate();
}
});
uploadForm.addFormSubmitFailedHandler(new FormSubmitFailedHandler() {
@@ -142,7 +138,6 @@ public class BundleUploadDataStep implements WizardStep {
allFilesStatus.put(uploadForm.getName(), Boolean.FALSE);
CoreGUI.getMessageCenter().notify(
new Message("Failed to upload file", null, Message.Severity.Error));
- enableNextButtonWhenAppropriate();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index c257909..5743653 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -47,9 +47,9 @@ public interface BundleGWTService extends RemoteService {
BundleVersion createBundleVersion(int bundleId, String name, String version, String recipe) throws Exception;
- void deleteBundle(int bundleId);
+ void deleteBundle(int bundleId) throws Exception;
- void deleteBundleVersion(int bundleVersionId);
+ void deleteBundleVersion(int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception;
PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws Exception;
@@ -60,7 +60,7 @@ public interface BundleGWTService extends RemoteService {
HashMap<String, Boolean> getAllBundleVersionFilenames(int bundleVersionId) throws Exception;
- ArrayList<BundleType> getAllBundleTypes();
+ ArrayList<BundleType> getAllBundleTypes() throws Exception;
BundleDeployment scheduleBundleDeployment(int bundleDeployDefinitionId, int resourceId) throws Exception;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 25eba1c..5473a94 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -89,7 +89,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
return SerialUtility.prepare(results, "createBundleVersion");
}
- public void deleteBundle(int bundleId) {
+ public void deleteBundle(int bundleId) throws Exception {
try {
bundleManager.deleteBundle(getSessionSubject(), bundleId);
} catch (Exception e) {
@@ -97,15 +97,15 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
- public void deleteBundleVersion(int bundleVersionId) {
+ public void deleteBundleVersion(int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception {
try {
- bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId);
+ bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId, deleteBundleIfEmpty);
} catch (Exception e) {
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
}
- public PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) {
+ public PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws Exception {
try {
PageList<Bundle> results = bundleManager.findBundlesByCriteria(getSessionSubject(), criteria);
return SerialUtility.prepare(results, "findBundlesByCriteria");
@@ -114,7 +114,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
- public PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) {
+ public PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) throws Exception {
try {
PageList<BundleVersion> results = bundleManager.findBundleVersionsByCriteria(getSessionSubject(), criteria);
return SerialUtility.prepare(results, "findBundleVersionsByCriteria");
@@ -124,7 +124,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
public PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(
- BundleCriteria criteria) {
+ BundleCriteria criteria) throws Exception {
try {
PageList<BundleWithLatestVersionComposite> results;
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(getSessionSubject(), criteria);
@@ -134,7 +134,7 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
- public ArrayList<BundleType> getAllBundleTypes() {
+ public ArrayList<BundleType> getAllBundleTypes() throws Exception {
try {
ArrayList<BundleType> bundleTypes = new ArrayList<BundleType>();
bundleTypes.addAll(bundleManager.getAllBundleTypes(getSessionSubject()));
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 440eee6..e52e3b6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -674,7 +674,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
for (BundleVersion bv : bundle.getBundleVersions()) {
- bundleManager.deleteBundleVersion(subject, bv.getId());
+ bundleManager.deleteBundleVersion(subject, bv.getId(), false);
}
// we need to whack the Repo once the Bundle no longer refers to it
@@ -687,23 +687,28 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
+ public void deleteBundleVersion(Subject subject, int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception {
BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
if (null == bundleVersion) {
return;
}
- int bundleId = bundleVersion.getBundle().getId();
+ int bundleId = 0;
+ if (deleteBundleIfEmpty) {
+ bundleId = bundleVersion.getBundle().getId(); // note that we lazy load this if we never plan to delete the bundle
+ }
// remove the bundle version - cascade remove the deploy defs which will cascade remove the deployments.
this.entityManager.remove(bundleVersion);
- this.entityManager.flush();
- Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
- q.setParameter("bundleId", bundleId);
- if (q.getResultList().size() == 0) {
- // there are no more bundle versions left, blow away the bundle and all repo/bundle files associated with it
- deleteBundle(subject, bundleId);
+ if (deleteBundleIfEmpty) {
+ this.entityManager.flush();
+ Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
+ q.setParameter("bundleId", bundleId);
+ if (q.getResultList().size() == 0) {
+ // there are no more bundle versions left, blow away the bundle and all repo/bundle files associated with it
+ deleteBundle(subject, bundleId);
+ }
}
return;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index b3a84ff..efde215 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -204,12 +204,15 @@ public interface BundleManagerRemote {
*
* @param subject
* @param bundleVersionId
+ * @param deleteBundleIfEmpty if <code>true</code> and if this method deletes the last bundle version for its
+ * bundle, then that bundle entity itself will be completely purged
* @throws Exception if any part of the removal fails.
*/
@WebMethod
void deleteBundleVersion( //
@WebParam(name = "subject") Subject subject, //
- @WebParam(name = "bundleVersionId") int bundleVersionId) throws Exception;
+ @WebParam(name = "bundleVersionId") int bundleVersionId, //
+ @WebParam(name = "deleteBundleIfEmpty") boolean deleteBundleIfEmpty) throws Exception;
@WebMethod
PageList<Bundle> findBundlesByCriteria( //
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 6521e5b..17d3c96 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -375,8 +375,8 @@ public class WebservicesManagerBean implements WebservicesRemote {
bundleManager.deleteBundle(subject, bundleId);
}
- public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
- bundleManager.deleteBundleVersion(subject, bundleVersionId);
+ public void deleteBundleVersion(Subject subject, int bundleVersionId, boolean deleteBundleIfEmpty) throws Exception {
+ bundleManager.deleteBundleVersion(subject, bundleVersionId, deleteBundleIfEmpty);
}
public PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 833d844..0d99b17 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -295,7 +295,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
BundleCriteria bCriteria = new BundleCriteria();
// delete the first one - this deletes the BV but the bundle should remain intact
- bundleManager.deleteBundleVersion(overlord, bv2.getId());
+ bundleManager.deleteBundleVersion(overlord, bv2.getId(), true);
bvCriteria.addFilterId(bv2.getId());
PageList<BundleVersion> bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
assert bvResults.size() == 0;
@@ -304,7 +304,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert bResults.size() == 1 : "Should not have deleted bundle yet, 1 version still exists";
// delete the second one - this deletes last BV thus the bundle should also get deleted
- bundleManager.deleteBundleVersion(overlord, bv1.getId());
+ bundleManager.deleteBundleVersion(overlord, bv1.getId(), true);
bvCriteria.addFilterId(bv1.getId());
bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
assert bvResults.size() == 0;
commit 0b503904be650eae0418dd646a617b4fed1c9e9e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 24 00:48:19 2010 -0400
get the wizard framework to know when the wizard is finished and to close the dialog when it is
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
index b30e6a7..e0f3f92 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
@@ -125,24 +125,23 @@ public class WizardView extends VLayout {
cancelButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
wizard.cancel();
- wizardWindow.destroy();
+ closeDialog();
}
});
previousButton = new IButton("Previous");
previousButton.setDisabled(true);
previousButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
- setStep(currentStep - 1);
+ decrementStep();
}
});
nextButton = new IButton("Next");
- nextButton.setDisabled(true);
nextButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
WizardStep step = wizard.getSteps().get(currentStep);
if (step.nextPage()) {
- setStep(currentStep + 1);
+ incrementStep();
}
}
});
@@ -154,18 +153,31 @@ public class WizardView extends VLayout {
}
- public void setStep(int stepIndex) {
+ private void setStep(int stepIndex) {
currentStep = stepIndex;
- stepLabel.setContents("Step " + (stepIndex + 1) + " of " + wizard.getSteps().size());
- WizardStep step = wizard.getSteps().get(currentStep);
+ List<WizardStep> wizardSteps = wizard.getSteps();
+
+ // determine if we are "finished" - that is, going past our last step
+ if (currentStep >= wizardSteps.size()) {
+ closeDialog();
+ return;
+ }
+
+ stepLabel.setContents("Step " + (stepIndex + 1) + " of " + wizardSteps.size());
+
+ WizardStep step = wizardSteps.get(currentStep);
stepTitleLabel.setContents(step.getName());
previousButton.setDisabled(stepIndex == 0);
- boolean last = (stepIndex == (wizard.getSteps().size() - 1));
- nextButton.setDisabled(last);
+ boolean last = (stepIndex == (wizardSteps.size() - 1));
+ if (last) {
+ nextButton.setTitle("Finish");
+ } else {
+ nextButton.setTitle("Next");
+ }
for (IButton button : customButtons) {
buttonBar.removeMember(button);
@@ -182,7 +194,7 @@ public class WizardView extends VLayout {
if (currentCanvas != null) {
contentLayout.removeMember(currentCanvas);
}
- currentCanvas = wizard.getSteps().get(currentStep).getCanvas();
+ currentCanvas = wizardSteps.get(currentStep).getCanvas();
contentLayout.addMember(currentCanvas);
markForRedraw();
@@ -201,7 +213,7 @@ public class WizardView extends VLayout {
wizardWindow.addCloseClickHandler(new CloseClickHandler() {
public void onCloseClick(CloseClientEvent closeClientEvent) {
wizard.cancel();
- wizardWindow.destroy();
+ closeDialog();
}
});
wizardWindow.addItem(this);
@@ -232,4 +244,8 @@ public class WizardView extends VLayout {
public void incrementStep() {
setStep(currentStep + 1);
}
+
+ public void decrementStep() {
+ setStep(currentStep - 1);
+ }
}
commit b39be42983f7a27932ff270c7ee5021e2ef38338
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 23:48:39 2010 -0400
remove the obsolete/unused isNext/PreviousEnabled methods from the steps classes
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java
index 6ae3921..42de0a4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationParametersStep.java
@@ -67,12 +67,4 @@ public class OperationParametersStep implements WizardStep {
public Configuration getParameterConfiguration() {
return configurationEditor != null ? configurationEditor.getConfiguration() : null;
}
-
- public boolean isNextEnabled() {
- return true;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java
index e923b08..c1546a8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationSchedulingStep.java
@@ -42,7 +42,7 @@ import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.TimeItem;
import com.smartgwt.client.widgets.form.validator.CustomValidator;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
/**
@@ -66,12 +66,12 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setWidth100();
form.setPadding(10);
form.setNumCols(3);
-// form.setColWidths("15%", "35%", "15%", "*");
+ // form.setColWidths("15%", "35%", "15%", "*");
form.setValidateOnChange(true);
final RadioGroupItem start = new RadioGroupItem("start", "Start");
start.setColSpan(3);
- start.setValueMap(enumValueMap(ExecutionSchedule.Start.class)); // "Immediately", "Future"
+ start.setValueMap(enumValueMap(ExecutionSchedule.Start.class)); // "Immediately", "Future"
start.setRedrawOnChange(true);
start.setValue("Immediately");
@@ -84,7 +84,7 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
});
RadioGroupItem recurr = new RadioGroupItem("recurr", "Recurrence");
- recurr.setValueMap(enumValueMap(ExecutionSchedule.Recurr.class)); // "Once", "EveryNMinutes", "Hourly", "Daily", "Weekly", "Monthly");
+ recurr.setValueMap(enumValueMap(ExecutionSchedule.Recurr.class)); // "Once", "EveryNMinutes", "Hourly", "Daily", "Weekly", "Monthly");
recurr.setRedrawOnChange(true);
recurr.setValue("Once");
recurr.setShowIfCondition(new FormItemIfFunction() {
@@ -93,26 +93,23 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
}
});
-
-
CanvasItem onceForm = new CanvasItem("once", "Run At");
onceForm.setShowTitle(false);
onceForm.setCanvas(getOnceForm());
onceForm.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
- return !"Immediately".equals(form.getValueAsString("start")) &&
- ExecutionSchedule.Recurr.Once.name().equals(form.getValueAsString("recurr"));
+ return !"Immediately".equals(form.getValueAsString("start"))
+ && ExecutionSchedule.Recurr.Once.name().equals(form.getValueAsString("recurr"));
}
});
-
CanvasItem everyNMinuteForm = new CanvasItem("everyNMinutesForm", "NMinutes");
everyNMinuteForm.setShowTitle(false);
everyNMinuteForm.setCanvas(getEveryNMinutesForm());
everyNMinuteForm.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
- return !"Immediately".equals(form.getValueAsString("start")) &&
- ExecutionSchedule.Recurr.EveryNMinutes.name().equals(form.getValueAsString("recurr"));
+ return !"Immediately".equals(form.getValueAsString("start"))
+ && ExecutionSchedule.Recurr.EveryNMinutes.name().equals(form.getValueAsString("recurr"));
}
});
@@ -121,8 +118,8 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
hourlyForm.setCanvas(getHourlyForm());
hourlyForm.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
- return !"Immediately".equals(form.getValueAsString("start")) &&
- ExecutionSchedule.Recurr.Hourly.name().equals(form.getValueAsString("recurr"));
+ return !"Immediately".equals(form.getValueAsString("start"))
+ && ExecutionSchedule.Recurr.Hourly.name().equals(form.getValueAsString("recurr"));
}
});
@@ -136,7 +133,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
}
});
-
CanvasItem weeklyForm = new CanvasItem("weekly", "Weekly");
weeklyForm.setShowTitle(false);
weeklyForm.setCanvas(getWeeklyForm());
@@ -212,12 +208,8 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
messageItem.setShowTitle(false);
messageItem.setCellStyle("HeaderLabel");
- form.setItems(start, scheduleHeader, recurr,
- onceForm, everyNMinuteForm, hourlyForm, dailyForm, weeklyForm, monthlyForm,
- rangeHeader, startDate, end, endDate,
- new SpacerItem(), messageItem);
-
-
+ form.setItems(start, scheduleHeader, recurr, onceForm, everyNMinuteForm, hourlyForm, dailyForm, weeklyForm,
+ monthlyForm, rangeHeader, startDate, end, endDate, new SpacerItem(), messageItem);
form.addItemChangedHandler(this);
}
@@ -255,7 +247,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Every N Minutes");
form.addItemChangedHandler(this);
-
form.setWrapItemTitles(false);
form.setNumCols(2);
@@ -276,7 +267,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Hourly At");
form.addItemChangedHandler(this);
-
form.setWrapItemTitles(false);
form.setNumCols(2);
@@ -289,7 +279,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
return form;
}
-
private DynamicForm getDailyForm() {
DynamicForm form = new DynamicForm();
form.setValuesManager(valuesManager);
@@ -308,7 +297,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
return form;
}
-
private DynamicForm getWeeklyForm() {
DynamicForm form = new DynamicForm();
form.setValuesManager(valuesManager);
@@ -317,7 +305,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Weekly On");
form.addItemChangedHandler(this);
-
form.setWrapItemTitles(false);
TimeItem timeOfDay = new TimeItem("timeOfDay", "Time Of Day");
@@ -347,7 +334,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
form.setGroupTitle("Monthly On");
form.addItemChangedHandler(this);
-
IntegerItem dayItem = new IntegerItem();
dayItem.setName("dayOfMonth");
dayItem.setTitle("Day of Month");
@@ -370,21 +356,11 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
return "Schedule";
}
- public boolean isNextEnabled() {
- return true;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
-
public void onItemChanged(ItemChangedEvent itemChangeEvent) {
-
executionSchedule.setStart(ExecutionSchedule.Start.valueOf(valuesManager.getValueAsString("start")));
executionSchedule.setRecurr(ExecutionSchedule.Recurr.valueOf(valuesManager.getValueAsString("recurr")));
-
Date onceDate = (Date) valuesManager.getValues().get("onceStartDate");
executionSchedule.setOnceDateTime(onceDate);
@@ -394,7 +370,6 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
executionSchedule.setTimeOfDay((Date) valuesManager.getValues().get("timeOfDay"));
-
HashSet<ExecutionSchedule.DayOfWeek> selectedDays = new HashSet<ExecutionSchedule.DayOfWeek>(); //.noneOf(ExecutionSchedule.DayOfWeek.class);
for (ExecutionSchedule.DayOfWeek d : EnumSet.allOf(ExecutionSchedule.DayOfWeek.class)) {
if (valuesManager.getValues().containsKey(d.name())) {
@@ -403,29 +378,24 @@ public class OperationSchedulingStep implements WizardStep, ItemChangedHandler {
}
executionSchedule.setDaysOfWeek(selectedDays);
-
-
executionSchedule.setDayOfMonth(Integer.parseInt(valuesManager.getValueAsString("dayOfMonth")));
-
-
- executionSchedule.setStartDate((Date)valuesManager.getValues().get("startDate"));
+ executionSchedule.setStartDate((Date) valuesManager.getValues().get("startDate"));
if ("Never".equals(valuesManager.getValues().get("endType"))) {
executionSchedule.setEndDate(null);
} else {
- executionSchedule.setEndDate((Date)valuesManager.getValues().get("endDate"));
+ executionSchedule.setEndDate((Date) valuesManager.getValues().get("endDate"));
}
- form.setValue("message",executionSchedule.getMessage());
+ form.setValue("message", executionSchedule.getMessage());
}
-
- private LinkedHashMap<String,String> enumValueMap(Class<? extends Enum> e) {
- LinkedHashMap<String,String> map = new LinkedHashMap<String, String>();
+ private LinkedHashMap<String, String> enumValueMap(Class<? extends Enum> e) {
+ LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
for (Object o : EnumSet.allOf(e)) {
Enum v = (Enum) o;
- map.put(v.name(),v.name()); // localize
+ map.put(v.name(), v.name()); // localize
}
return map;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java
index 33ddebe..0d466d3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationStep.java
@@ -18,15 +18,10 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.factory;
-import java.util.Map;
-
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.form.DynamicForm;
-import com.smartgwt.client.widgets.form.fields.SelectItem;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.domain.configuration.definition.ConfigurationTemplate;
import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
@@ -61,14 +56,6 @@ public class ConfigurationStep implements WizardStep {
return "Edit Configuration";
}
- public boolean isPreviousEnabled() {
- return true;
- }
-
- public boolean isNextEnabled() {
- return false;
- }
-
public Configuration getConfiguration() {
return editor.getConfiguration();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java
index eee603a..a9182ee 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ConfigurationTemplateStep.java
@@ -51,7 +51,7 @@ public class ConfigurationTemplateStep implements WizardStep {
TextItem nameItem = new TextItem("resourceName", "Resource Name");
nameItem.setRequired(true);
- SelectItem templateSelect = new SelectItem("template","Template");
+ SelectItem templateSelect = new SelectItem("template", "Template");
ConfigurationDefinition definition = wizard.getConfigurationDefinition();
@@ -77,14 +77,6 @@ public class ConfigurationTemplateStep implements WizardStep {
return "Select a Template";
}
- public boolean isPreviousEnabled() {
- return false;
- }
-
- public boolean isNextEnabled() {
- return true;
- }
-
public Configuration getConfiguration() {
return templates.get(form.getValueAsString("template")).createConfiguration();
}
commit 24b38a17ceca586ad9df9bf5b2e6209e2c64a4af
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 23:28:24 2010 -0400
delete the bundle if, when deleting a BV it turns out there are no more bundle versions for that bundle
this includes a unit test to make sure deleting BVs work
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index bab247a..440eee6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -677,7 +677,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
bundleManager.deleteBundleVersion(subject, bv.getId());
}
- // we need to whack the Repo once the Bundle no longe refers to it
+ // we need to whack the Repo once the Bundle no longer refers to it
Repo bundleRepo = bundle.getRepo();
this.entityManager.remove(bundle);
@@ -686,14 +686,26 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
repoManager.deleteRepo(subject, bundleRepo.getId());
}
- public void deleteBundleVersion(Subject subject, int bundleVersionId) {
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
if (null == bundleVersion) {
return;
}
- // remove the bundle version, this will cascade remove the deploy defs which will cascade remove
- // the deployments.
+ int bundleId = bundleVersion.getBundle().getId();
+
+ // remove the bundle version - cascade remove the deploy defs which will cascade remove the deployments.
this.entityManager.remove(bundleVersion);
+ this.entityManager.flush();
+
+ Query q = entityManager.createNamedQuery(BundleVersion.QUERY_FIND_VERSION_INFO_BY_BUNDLE_ID);
+ q.setParameter("bundleId", bundleId);
+ if (q.getResultList().size() == 0) {
+ // there are no more bundle versions left, blow away the bundle and all repo/bundle files associated with it
+ deleteBundle(subject, bundleId);
+ }
+
+ return;
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index c2284d9..833d844 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -45,11 +45,13 @@ import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.Package;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.InventoryStatus;
@@ -269,6 +271,49 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
}
@Test(enabled = TESTS_ENABLED)
+ public void testDeleteBundleVersion() throws Exception {
+ Bundle b1 = createBundle("one");
+ assertNotNull(b1);
+ BundleVersion bv1 = createBundleVersion(b1.getName() + "-1", null, b1);
+ assertNotNull(bv1);
+ assertEquals("1.0", bv1.getVersion());
+ BundleVersion bv2 = createBundleVersion(b1.getName() + "-2", null, b1);
+ assertNotNull(bv2);
+ assertEquals("1.1", bv2.getVersion());
+
+ // let's add a bundle file so we can ensure our deletion will also delete the file too
+ bundleManager.addBundleFileViaByteArray(overlord, bv2.getId(), "testfile", "1.0", new Architecture("noarch"),
+ "content".getBytes(), false);
+ BundleFileCriteria bfCriteria = new BundleFileCriteria();
+ bfCriteria.addFilterBundleVersionId(bv2.getId());
+ bfCriteria.fetchPackageVersion(true);
+ PageList<BundleFile> files = bundleManager.findBundleFilesByCriteria(overlord, bfCriteria);
+ assert files.size() == 1 : files;
+ assert files.get(0).getPackageVersion().getGeneralPackage().getName().equals("testfile") : files;
+
+ BundleVersionCriteria bvCriteria = new BundleVersionCriteria();
+ BundleCriteria bCriteria = new BundleCriteria();
+
+ // delete the first one - this deletes the BV but the bundle should remain intact
+ bundleManager.deleteBundleVersion(overlord, bv2.getId());
+ bvCriteria.addFilterId(bv2.getId());
+ PageList<BundleVersion> bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
+ assert bvResults.size() == 0;
+ bCriteria.addFilterId(b1.getId());
+ PageList<Bundle> bResults = bundleManager.findBundlesByCriteria(overlord, bCriteria);
+ assert bResults.size() == 1 : "Should not have deleted bundle yet, 1 version still exists";
+
+ // delete the second one - this deletes last BV thus the bundle should also get deleted
+ bundleManager.deleteBundleVersion(overlord, bv1.getId());
+ bvCriteria.addFilterId(bv1.getId());
+ bvResults = bundleManager.findBundleVersionsByCriteria(overlord, bvCriteria);
+ assert bvResults.size() == 0;
+ bCriteria.addFilterId(b1.getId());
+ bResults = bundleManager.findBundlesByCriteria(overlord, bCriteria);
+ assert bResults.size() == 0 : "Should have deleted bundle since no versions exists anymore";
+ }
+
+ @Test(enabled = TESTS_ENABLED)
public void testCreateBundleVersionOrdering() throws Exception {
Bundle b1 = createBundle("one");
assertNotNull(b1);
commit 1531142b056f293af50fddc51352cda5a4132869
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 23:27:44 2010 -0400
fix bundle file criteria - name of field should be "general"Package
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
index 8341922..8abe728 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
@@ -41,7 +41,7 @@ public class BundleFileCriteria extends Criteria {
private boolean fetchBundleVersion;
private boolean fetchPackageVersion;
- private boolean fetchPackage;
+ private boolean fetchGeneralPackage;
public BundleFileCriteria() {
super();
@@ -76,8 +76,8 @@ public class BundleFileCriteria extends Criteria {
this.fetchBundleVersion = fetchBundleVersion;
}
- public void fetchPackage(boolean fetchPackage) {
- this.fetchPackage = fetchPackage;
+ public void fetchPackage(boolean fetchGeneralPackage) {
+ this.fetchGeneralPackage = fetchGeneralPackage;
}
public void fetchPackageVersion(boolean fetchPackageVersion) {
14 years, 1 month
[rhq] Branch 'gwt' - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java | 27 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java | 39 --------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java | 46 ++++++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java | 37 --------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java | 22 +---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java | 6 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java | 37 +++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java | 4
9 files changed, 101 insertions(+), 121 deletions(-)
New commits:
commit 89d3004322b490efcccdd2a107b3dcddd7dad37b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 15:02:49 2010 -0400
get the wizard to cancel when you click the X
get the bundle types to show in selection
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
index 81d13ca..01e2598 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/AbstractBundleCreateWizard.java
@@ -18,9 +18,16 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.create;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.AbstractBundleWizard;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
@@ -79,4 +86,24 @@ public abstract class AbstractBundleCreateWizard extends AbstractBundleWizard {
public void setBundleVersion(BundleVersion bv) {
this.bundleVersion = bv;
}
+
+ public void cancel() {
+ final BundleVersion bv = getBundleVersion();
+ if (bv != null) {
+ // the user must have created it already after verification step, delete it
+ BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
+ Severity.Info));
+ }
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to fully cancel - bundle may still exist in the database", caught);
+ }
+ });
+ }
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
index e2fe45f..e76dc7f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleCreateWizard.java
@@ -20,18 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.bundle.create;
import java.util.ArrayList;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.widgets.IButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-
-import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public class BundleCreateWizard extends AbstractBundleCreateWizard {
@@ -42,35 +31,7 @@ public class BundleCreateWizard extends AbstractBundleCreateWizard {
ArrayList<WizardStep> steps = new ArrayList<WizardStep>();
steps.add(new BundleInfoStep(this));
steps.add(new BundleUploadRecipeStep(this));
-// steps.add(new BundleVerificationStep(this));
steps.add(new BundleUploadDataStep(this));
setSteps(steps);
}
-
- @Override
- public void startBundleWizard() {
- super.startBundleWizard();
- IButton cancelButton = getView().getCancelButton();
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- final BundleVersion bv = getBundleVersion();
- if (bv != null) {
- // the user must have created it already after verification step, delete it
- BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
- Severity.Info));
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "Failed to fully cancel - bundle may still exist in the database", caught);
- }
- });
- }
- }
- });
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
index e5e2653..2bfc93d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleInfoStep.java
@@ -19,12 +19,14 @@
package org.rhq.enterprise.gui.coregui.client.bundle.create;
import java.util.ArrayList;
+import java.util.HashMap;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.TitleOrientation;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
@@ -46,9 +48,12 @@ public class BundleInfoStep implements WizardStep {
private final AbstractBundleCreateWizard wizard;
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ private final HashMap<String, BundleType> knownBundleTypes = new HashMap<String, BundleType>();
+
private TextItem nameTextItem;
private TextItem versionTextItem;
private TextAreaItem descriptionTextAreaItem;
+ private SelectItem bundleTypeDropDownMenu;
public BundleInfoStep(AbstractBundleCreateWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -61,6 +66,19 @@ public class BundleInfoStep implements WizardStep {
form.setWidth100();
form.setNumCols(2);
+ bundleTypeDropDownMenu = new SelectItem("bundleTypeDropDownMenu", "Bundle Type");
+ bundleTypeDropDownMenu.setVisible(false);
+ bundleTypeDropDownMenu.setDisabled(true);
+ bundleTypeDropDownMenu.setTitleAlign(Alignment.LEFT);
+ bundleTypeDropDownMenu.setAllowEmptyValue(false);
+ bundleTypeDropDownMenu.setMultiple(false);
+ bundleTypeDropDownMenu.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ BundleType bundleType = knownBundleTypes.get(event.getValue());
+ wizard.setBundleType(bundleType);
+ }
+ });
+
nameTextItem = new TextItem("name", "Name");
nameTextItem.setRequired(true);
nameTextItem.setTitleAlign(Alignment.LEFT);
@@ -83,7 +101,8 @@ public class BundleInfoStep implements WizardStep {
descriptionTextAreaItem.setColSpan(2);
descriptionTextAreaItem.setWidth(300);
- form.setItems(nameTextItem, previousVersionTextItem, versionTextItem, descriptionTextAreaItem);
+ form.setItems(bundleTypeDropDownMenu, nameTextItem, previousVersionTextItem, versionTextItem,
+ descriptionTextAreaItem);
BundleVersion initialBundleVersion = wizard.getBundleVersion();
if (initialBundleVersion != null) {
@@ -107,11 +126,23 @@ public class BundleInfoStep implements WizardStep {
}
if (wizard.getBundleType() == null) {
- // TODO: we should get all bundle types in a drop down menu and let the user pick
- // for now assume we always get one (the filetemplate one) and use it
bundleServer.getAllBundleTypes(new AsyncCallback<ArrayList<BundleType>>() {
public void onSuccess(ArrayList<BundleType> result) {
- wizard.setBundleType(result.get(0));
+ for (BundleType bundleType : result) {
+ knownBundleTypes.put(bundleType.getName(), bundleType);
+ if (wizard.getBundleType() == null) {
+ wizard.setBundleType(bundleType);
+ bundleTypeDropDownMenu.setDefaultValue(bundleType.getName());
+ bundleTypeDropDownMenu.setValue(bundleType.getName());
+ }
+ }
+ bundleTypeDropDownMenu.setValueMap(knownBundleTypes.keySet().toArray(new String[0]));
+ bundleTypeDropDownMenu.setDisabled(false);
+ // don't bother showing the menu if there is only one item
+ if (knownBundleTypes.size() > 1) {
+ bundleTypeDropDownMenu.setVisible(true);
+ bundleTypeDropDownMenu.show(); // in case we've already been rendered
+ }
}
public void onFailure(Throwable caught) {
@@ -123,9 +154,10 @@ public class BundleInfoStep implements WizardStep {
} else {
if (wizard.getBundleVersion() != null) {
// we are traversing back to this step - don't allow changes if we've already created the bundle version
- nameTextItem.setDisabled(Boolean.TRUE);
- versionTextItem.setDisabled(Boolean.TRUE);
- descriptionTextAreaItem.setDisabled(Boolean.TRUE);
+ bundleTypeDropDownMenu.setDisabled(true);
+ nameTextItem.setDisabled(true);
+ versionTextItem.setDisabled(true);
+ descriptionTextAreaItem.setDisabled(true);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java
index dfb8c15..95152bc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUpdateWizard.java
@@ -20,18 +20,8 @@ package org.rhq.enterprise.gui.coregui.client.bundle.create;
import java.util.ArrayList;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.widgets.IButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-
import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
public class BundleUpdateWizard extends AbstractBundleCreateWizard {
@@ -47,31 +37,4 @@ public class BundleUpdateWizard extends AbstractBundleCreateWizard {
steps.add(new BundleUploadDataStep(this));
setSteps(steps);
}
-
- @Override
- public void startBundleWizard() {
- super.startBundleWizard();
- IButton cancelButton = getView().getCancelButton();
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- final BundleVersion bv = getBundleVersion();
- if (bv != null) {
- // the user must have created it already after verification step, delete it
- BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- bundleServer.deleteBundleVersion(bv.getId(), new AsyncCallback<Void>() {
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message("Canceled bundle [" + bv.getName() + "] version [" + bv.getVersion() + "]",
- Severity.Info));
- }
-
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- "Failed to fully cancel - bundle may still exist in the database", caught);
- }
- });
- }
- }
- });
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
index 1d0749e..284d94c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/BundleDeployWizard.java
@@ -21,10 +21,6 @@ package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
import java.util.ArrayList;
import java.util.List;
-import com.smartgwt.client.widgets.IButton;
-import com.smartgwt.client.widgets.events.ClickEvent;
-import com.smartgwt.client.widgets.events.ClickHandler;
-
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -81,18 +77,12 @@ public class BundleDeployWizard extends AbstractBundleDeployWizard {
return steps;
}
- @Override
- public void startBundleWizard() {
- super.startBundleWizard();
- IButton cancelButton = getView().getCancelButton();
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- BundleDeployDefinition bdd = getBundleDeployDefinition();
- if (bdd != null && isNewDefinition()) {
- // the user must have created it already after verification step, delete it
- }
- }
- });
+ public void cancel() {
+ BundleDeployDefinition bdd = getBundleDeployDefinition();
+ if (bdd != null && isNewDefinition()) {
+ // the user must have created it already after verification step, delete it
+ // TODO
+ }
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java
index e57b4f9..b82ebd4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/Wizard.java
@@ -37,4 +37,8 @@ public interface Wizard {
List<IButton> getCustomButtons(int step);
+ /**
+ * This is called when the cancel button or the wizard window's "X" close button is clicked.
+ */
+ void cancel();
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
index c92c0f2..b30e6a7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/wizard/WizardView.java
@@ -18,8 +18,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.components.wizard;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
@@ -116,7 +116,7 @@ public class WizardView extends VLayout {
*/
public void refreshTitleLabelContents() {
this.titleLabel.setContents("<span class=\"HeaderLabel\">" + wizard.getTitle() + "</span><br/>"
- + (wizard.getSubtitle() != null ? wizard.getSubtitle() : ""));
+ + (wizard.getSubtitle() != null ? wizard.getSubtitle() : ""));
}
private void setupButtons() {
@@ -124,6 +124,7 @@ public class WizardView extends VLayout {
cancelButton.setDisabled(false);
cancelButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
+ wizard.cancel();
wizardWindow.destroy();
}
});
@@ -199,6 +200,7 @@ public class WizardView extends VLayout {
wizardWindow.centerInPage();
wizardWindow.addCloseClickHandler(new CloseClickHandler() {
public void onCloseClick(CloseClientEvent closeClientEvent) {
+ wizard.cancel();
wizardWindow.destroy();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java
index fb17747..d273596 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/create/OperationCreateWizard.java
@@ -123,29 +123,26 @@ public class OperationCreateWizard implements Wizard {
Configuration parameters = parametersStep.getParameterConfiguration();
final ExecutionSchedule schedule = schedulingStep.getExecutionSchedule();
- GWTServiceLookup.getOperationService().scheduleResourceOperation(
- resource.getId(),
- operationDefinition.getName(),
- parameters,
- schedule,
- " testing ",
- 0,
- new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError("Failed to schedule operation execution",caught);
- }
-
- public void onSuccess(Void result) {
-
- String message = "Schedule operation [" + operationDefinition.getName()
- + "] on resource [" + resource.getId() + "] with cron string [" + schedule.getCronString() + "]";
-
- CoreGUI.getMessageCenter().notify(new Message(message, Message.Severity.Info));
- }
+ GWTServiceLookup.getOperationService().scheduleResourceOperation(resource.getId(),
+ operationDefinition.getName(), parameters, schedule, " testing ", 0, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to schedule operation execution", caught);
}
- );
+ public void onSuccess(Void result) {
+
+ String message = "Schedule operation [" + operationDefinition.getName() + "] on resource ["
+ + resource.getId() + "] with cron string [" + schedule.getCronString() + "]";
+
+ CoreGUI.getMessageCenter().notify(new Message(message, Message.Severity.Info));
+ }
+ });
view.closeDialog();
}
+
+ @Override
+ public void cancel() {
+ // TODO: revert back to original state
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java
index 363bb3e..b84a44e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/factory/ResourceFactoryCreateWizard.java
@@ -165,4 +165,8 @@ public class ResourceFactoryCreateWizard implements Wizard {
public ResourceType getCreateType() {
return createType;
}
+
+ public void cancel() {
+ // TODO: revert back to original state
+ }
}
14 years, 1 month
[rhq] 28 commits - modules/core modules/enterprise
by John Sanda
modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml | 22
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 38 +
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 56 +
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java | 128 ++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java | 27
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java | 87 +++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java | 139 ++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java | 148 +++++
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java | 54 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java | 21
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java | 18
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java | 11
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java | 13
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java | 12
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java | 6
modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties | 8
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml | 42 +
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml | 4
modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp | 27
modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp | 30 +
modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp | 39 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java | 102 +++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java | 281 ++++++++++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java | 25
28 files changed, 1334 insertions(+), 21 deletions(-)
New commits:
commit 59ef9c778f809c2723d3764c8dcd5bdf7660f909
Merge: d6c56f6... eb64c17...
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Mar 23 11:43:37 2010 -0400
Merge branch 'master' into ldap
commit d6c56f6ad3a3bbd9cc9d4ce20ef339623359da82
Merge: 8f0337b... 6bf9398...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Mar 9 10:31:32 2010 -0500
Merge branch 'linux-config' into ldap
commit 8f0337b2df94be73adf900606e276b4d372dfa2a
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Mar 9 02:26:00 2010 -0500
Added code to handle ldap group queries
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index 4f3aaea..f2734a3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -20,6 +20,7 @@ package org.rhq.enterprise.server.authz;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
@@ -509,6 +510,9 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
private List<Role> findRolesByLdapGroupNames(List<String> ldapGroupNames) {
+ if (ldapGroupNames.isEmpty()) {
+ return Collections.EMPTY_LIST;
+ }
Query query = entityManager.createNamedQuery(LdapGroup.FIND_BY_ROLES_GROUP_NAMES);
query.setParameter("names", ldapGroupNames);
return (List<Role>) query.getResultList();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
index 3820a63..eb20236 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -19,7 +19,6 @@
package org.rhq.enterprise.server.resource.group;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -28,6 +27,8 @@ import java.util.Set;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
@@ -58,121 +59,110 @@ public class LdapGroupManager {
public Set<Map<String, String>> findAvailableGroups() {
SystemManagerLocal manager = LookupUtil.getSystemManager();
- manager.getSystemConfiguration();
- Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
- String[] names = { "bar", "foo" };
-
- for (String name : names) {
- Map<String, String> group = new HashMap<String, String>();
- group.put("id", name);
- group.put("name", name);
- group.put("description", name);
- ldapSet.add(group);
- }
- return ldapSet;
+
+ Properties options = manager.getSystemConfiguration();
+ String groupFilter = (String) options.get(RHQConstants.LDAPGroupFilter);
+ String filter = String.format("(%s)", groupFilter);
+
+ return buildGroup(options, filter);
}
public Set<String> findAvailableGroupsFor(String userName) {
SystemManagerLocal manager = LookupUtil.getSystemManager();
- manager.getSystemConfiguration();
- Set<String> ldapSet = new HashSet<String>();
- String[] names = { "foo" };
- for (String name : names) {
- ldapSet.add(name);
+ Properties options = manager.getSystemConfiguration();
+ String groupFilter = (String) options.get(RHQConstants.LDAPGroupFilter);
+ String groupMember = (String) options.get(RHQConstants.LDAPGroupMember);
+ String userDN = getUserDN(options, userName);
+ String filter = String.format("(&(%s)(%s=%s))", groupFilter, groupMember, userDN);
+
+ Set<Map<String, String>> matched = buildGroup(options, filter);
+
+ Set<String> ldapSet = new HashSet<String>();
+ for (Map<String, String> match : matched) {
+ ldapSet.add(match.get("id"));
}
return ldapSet;
}
- /*
- *
- {BindDN=uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com,
- java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, jboss.security.security_domain=JON,
- LoginProperty=uid, BaseDN=dc=rhndev,dc=redhat,dc=com, java.naming.provider.url=ldap://fjs-0-16.rhndev.redhat.com,
- java.naming.security.protocol=, BindPW=dog8code}
- */
- protected boolean test() throws Exception {
-
+ private String getUserDN(Properties options, String userName) {
// Load our LDAP specific properties
- Properties env = null;// getProperties();
+ Properties env = getProperties(options);
// Load the BaseDN
- String baseDN = "dc=rhndev,dc=redhat,dc=com";
+ // Load the BaseDN
+ String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
// Load the LoginProperty
- String loginProperty = "uid";
-
- // Load any search filter
-
- // Find the user that is calling us
- String userName = "sdoo";
-
+ String loginProperty = (String) options.get(RHQConstants.LDAPLoginProperty);
+ if (loginProperty == null) {
+ // Use the default
+ loginProperty = "cn";
+ }
// Load any information we may need to bind
- String bindDN = "uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com";
- String bindPW = "dog8code";
+ String bindDN = (String) options.get(RHQConstants.LDAPBindDN);
+ String bindPW = (String) options.get(RHQConstants.LDAPBindPW);
+ // Load any search filter
+ String searchFilter = (String) options.get(RHQConstants.LDAPFilter);
if (bindDN != null) {
env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
}
- InitialLdapContext ctx = new InitialLdapContext(env, null);
- SearchControls searchControls = getSearchControls();
-
- // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
- String filter;
- /* if ((searchFilter != null) && (searchFilter.length() != 0)) {
- filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
- } else {
- filter = "(" + loginProperty + "=" + userName + ")";
+
+ try {
+ InitialLdapContext ctx = new InitialLdapContext(env, null);
+ SearchControls searchControls = getSearchControls();
+
+ // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
+ String filter;
+ if ((searchFilter != null) && (searchFilter.length() != 0)) {
+ filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
+ } else {
+ filter = "(" + loginProperty + "=" + userName + ")";
+ }
+
+ log.debug("Using LDAP filter=" + filter);
+
+ // Loop through each configured base DN. It may be useful
+ // in the future to allow for a filter to be configured for
+ // each BaseDN, but for now the filter will apply to all.
+ String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+ for (int x = 0; x < baseDNs.length; x++) {
+ NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ if (!answer.hasMore()) {
+ log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
+ // Nothing found for this DN, move to the next one if we have one.
+ continue;
}
- */
- //filter = "(" + loginProperty + "=" + userName + ")";
- filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
- + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
-
- // Loop through each configured base DN. It may be useful
- // in the future to allow for a filter to be configured for
- // each BaseDN, but for now the filter will apply to all.
- String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
- log.info(Arrays.asList(baseDNs));
- for (int x = 0; x < baseDNs.length; x++) {
- NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
- log.info(answer.hasMore());
- while (answer.hasMore()) {
+
// We use the first match
SearchResult si = (SearchResult) answer.next();
- log.info(si);
-
- /*
- // Construct the UserDN
- String userDN = si.getName() + "," + baseDNs[x];
- print (userDN);
- ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
- ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, "dog8code");
- ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
- ctx.reconnect(null);*/
+
+ // Construct the UserDN
+ String userDN = si.getName() + "," + baseDNs[x];
+ return userDN;
}
+ // If we try all the BaseDN's and have not found a match, return false
+ return "";
+ } catch (NamingException e) {
+ throw new RuntimeException(e);
}
-
- // If we try all the BaseDN's and have not found a match, return false
- return false;
}
/**
+ * @throws NamingException
* @see org.jboss.security.auth.spi.UsernamePasswordLoginModule#validatePassword(java.lang.String,java.lang.String)
*/
- protected void buildGroup(Properties options, String userName) {
+ protected Set<Map<String, String>> buildGroup(Properties options, String filter) {
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
// Load our LDAP specific properties
Properties env = getProperties(options);
// Load the BaseDN
String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
- if (baseDN == null) {
- // If the BaseDN is not specified, log an error and refuse the login attempt
- log.info("BaseDN is not set, refusing login");
- }
// Load the LoginProperty
String loginProperty = (String) options.get(RHQConstants.LDAPLoginProperty);
@@ -180,54 +170,46 @@ public class LdapGroupManager {
// Use the default
loginProperty = "cn";
}
-
- String groupFilter = (String) options.get("groupFilter");
- String groupMember = (String) options.get("groupMember");
-
// Load any information we may need to bind
- String bindDN = (String) options.get("BindDN");
- String bindPW = (String) options.get("BindPW");
+ String bindDN = (String) options.get(RHQConstants.LDAPBindDN);
+ String bindPW = (String) options.get(RHQConstants.LDAPBindPW);
if (bindDN != null) {
env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
}
-
try {
InitialLdapContext ctx = new InitialLdapContext(env, null);
SearchControls searchControls = getSearchControls();
- String filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
- + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
- // Load any search filter
- String searchFilter = (String) options.get("Filter");
- // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
- if ((searchFilter != null) && (searchFilter.length() != 0)) {
- filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
- } else {
- filter = "(" + loginProperty + "=" + userName + ")";
- }
+ /*String filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
+ + ",ou=People, dc=rhndev, dc=redhat, dc=com))";*/
// Loop through each configured base DN. It may be useful
// in the future to allow for a filter to be configured for
// each BaseDN, but for now the filter will apply to all.
String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+
for (int x = 0; x < baseDNs.length; x++) {
NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
- if (!answer.hasMore()) {
- log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
-
- // Nothing found for this DN, move to the next one if we have one.
- continue;
+ while (answer.hasMore()) {
+ // We use the first match
+ SearchResult si = (SearchResult) answer.next();
+ Map<String, String> entry = new HashMap<String, String>();
+ String name = (String) si.getAttributes().get("cn").get();
+ Attribute desc = si.getAttributes().get("description");
+ String description = desc != null ? (String) desc.get() : "";
+ entry.put("id", name);
+ entry.put("name", name);
+ entry.put("description", description);
+ ret.add(entry);
}
-
- // We use the first match
- SearchResult si = (SearchResult) answer.next();
-
}
-
- } catch (Exception e) {
- log.info("Failed to validate password: " + e.getMessage());
+ } catch (NamingException e) {
+ // TODO Auto-generated catch block
+ throw new RuntimeException(e);
}
+
+ return ret;
}
/**
@@ -240,13 +222,11 @@ public class LdapGroupManager {
private Properties getProperties(Properties options) {
Properties env = new Properties(options);
// Set our default factory name if one is not given
- String factoryName = env.getProperty(Context.INITIAL_CONTEXT_FACTORY);
- if (factoryName == null) {
- env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
- }
+ String factoryName = env.getProperty(RHQConstants.LDAPFactory);
+ env.setProperty(Context.INITIAL_CONTEXT_FACTORY, factoryName);
// Setup SSL if requested
- String protocol = env.getProperty(Context.SECURITY_PROTOCOL);
+ String protocol = env.getProperty(RHQConstants.LDAPProtocol);
if ((protocol != null) && protocol.equals("ssl")) {
String ldapSocketFactory = env.getProperty("java.naming.ldap.factory.socket");
if (ldapSocketFactory == null) {
@@ -256,7 +236,7 @@ public class LdapGroupManager {
}
// Set the LDAP url
- String providerUrl = env.getProperty(Context.PROVIDER_URL);
+ String providerUrl = env.getProperty(RHQConstants.LDAPUrl);
if (providerUrl == null) {
providerUrl = "ldap://localhost:" + (((protocol != null) && protocol.equals("ssl")) ? "636" : "389");
}
commit 08e009091f9fbea25e5b08c3ab8b0bb82fa2c71d
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 14:51:08 2010 -0500
Added the logic to sync roles to ldap users on login
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
index 78fa9dc..b8e2beb 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
@@ -43,13 +43,16 @@ import org.rhq.core.domain.authz.Role;
*
*/
@Entity
-@NamedQueries( { @NamedQuery(name = LdapGroup.DELETE_BY_ID, query = "DELETE FROM LdapGroup an WHERE an.id IN ( :ids )") })
+@NamedQueries( {
+ @NamedQuery(name = LdapGroup.DELETE_BY_ID, query = "DELETE FROM LdapGroup an WHERE an.id IN ( :ids )"),
+ @NamedQuery(name = LdapGroup.FIND_BY_ROLES_GROUP_NAMES, query = "SELECT distinct l.role FROM LdapGroup l WHERE l.name in (:names)") })
@Table(name = "RHQ_ROLE_LDAP_GROUP")
@SequenceGenerator(name = "id", sequenceName = "RHQ_ROLE_LDAP_GROUP_ID_SEQ", allocationSize = 100)
@XmlAccessorType(XmlAccessType.FIELD)
public class LdapGroup implements Serializable {
private static final long serialVersionUID = 1L;
public static final String DELETE_BY_ID = "LdapGroup.deleteById";
+ public static final String FIND_BY_ROLES_GROUP_NAMES = "LdapGroup.findRolesByGroupNames";
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java
index 1c8b5a0..2c6db30 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/user/RegisterAction.java
@@ -18,7 +18,9 @@
*/
package org.rhq.enterprise.gui.admin.user;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -37,7 +39,10 @@ import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.action.BaseAction;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
import org.rhq.enterprise.gui.legacy.util.SessionUtils;
+import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManager;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -106,6 +111,14 @@ public class RegisterAction extends BaseAction {
HashMap parms = new HashMap(1);
parms.put(Constants.USER_PARAM, newSubject.getId());
+ String provider = LookupUtil.getSystemManager().getSystemConfiguration().getProperty(RHQConstants.JAASProvider);
+ if (RHQConstants.LDAPJAASProvider.equals(provider)) {
+ List<String> groupNames = new ArrayList(LdapGroupManager.getInstance().findAvailableGroupsFor(
+ newSubject.getName()));
+ RoleManagerLocal roleManager = LookupUtil.getRoleManager();
+ roleManager.assignRolesToLdapSubject(newSubject.getId(), groupNames);
+
+ }
return returnSuccess(request, mapping, parms, false);
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index bcf7738..4f3aaea 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -174,6 +174,14 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
*/
@RequiredPermission(Permission.MANAGE_SECURITY)
public void addRolesToSubject(Subject subject, int subjectId, int[] roleIds) {
+ addRolesToSubject(subject, subjectId, roleIds, false);
+ }
+
+ /**
+ * @see org.rhq.enterprise.server.authz.RoleManagerLocal#addRolesToSubject(Subject, int, int[])
+ */
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void addRolesToSubject(Subject subject, int subjectId, int[] roleIds, boolean isLdap) {
if (roleIds != null) {
Subject subjectToModify = subjectManager.getSubjectById(subjectId); // attach it
if (subjectToModify == null) {
@@ -194,10 +202,11 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
+ "], but role was not found");
}
role.addSubject(subjectToModify);
+ if (isLdap) {
+ role.addLdapSubject(subjectToModify);
+ }
}
}
-
- return;
}
/**
@@ -499,6 +508,23 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
}
+ private List<Role> findRolesByLdapGroupNames(List<String> ldapGroupNames) {
+ Query query = entityManager.createNamedQuery(LdapGroup.FIND_BY_ROLES_GROUP_NAMES);
+ query.setParameter("names", ldapGroupNames);
+ return (List<Role>) query.getResultList();
+ }
+
+ public void assignRolesToLdapSubject(int subjectId, List<String> ldapGroupNames) {
+ Subject sub = entityManager.find(Subject.class, subjectId);
+ List<Role> roles = findRolesByLdapGroupNames(ldapGroupNames);
+ sub.getRoles().clear();
+ sub.getLdapRoles().clear();
+ for (Role role : roles) {
+ sub.addRole(role);
+ sub.addLdapRole(role);
+ }
+ }
+
private void processDependentPermissions(Role role) {
/*
* if you can control user/roles, then you can give yourself permissions, too; so we might as well
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
index 34b81e0..30dcceb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
@@ -219,4 +219,5 @@ public interface RoleManagerLocal {
PageList<Role> findRolesByCriteria(Subject subject, RoleCriteria criteria);
+ void assignRolesToLdapSubject(int subjectId, List<String> ldapGroupNames);
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
index 1875475..3820a63 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -72,18 +72,14 @@ public class LdapGroupManager {
return ldapSet;
}
- public Set<Map<String, String>> findAvailableGroupsFor(String userName) {
+ public Set<String> findAvailableGroupsFor(String userName) {
SystemManagerLocal manager = LookupUtil.getSystemManager();
manager.getSystemConfiguration();
- Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
- String[] names = { "bar", "foo" };
+ Set<String> ldapSet = new HashSet<String>();
+ String[] names = { "foo" };
for (String name : names) {
- Map<String, String> group = new HashMap<String, String>();
- group.put("id", name);
- group.put("name", name);
- group.put("description", name);
- ldapSet.add(group);
+ ldapSet.add(name);
}
return ldapSet;
}
commit ac2479467dc65ab832e240749582df68183be033
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 12:07:05 2010 -0500
Added methods to get 2 kinds of ldap groups
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
index c673cb5..78b1f1f 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
@@ -81,8 +81,7 @@ public class AddLdapGroupsFormPrepareAction extends TilesAction {
log.trace("getting pending groups for role [" + roleId + ")");
String name = "foo";
- Set<Map<String, String>> allGroups = LdapGroupManager.getInstance().findAvailableGroupsByRole(whoami,
- role.getId());
+ Set<Map<String, String>> allGroups = LdapGroupManager.getInstance().findAvailableGroups();
RoleManagerLocal roleManager = LookupUtil.getRoleManager();
PageList<LdapGroup> assignedList = roleManager.findLdapGroupsByRole(role.getId(), PageControl
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
index 86bd8b4..1875475 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -35,7 +35,6 @@ import javax.naming.ldap.InitialLdapContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.system.SystemManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -57,7 +56,23 @@ public class LdapGroupManager {
return INSTANCE;
}
- public Set<Map<String, String>> findAvailableGroupsByRole(Subject subject, int roleId) {
+ public Set<Map<String, String>> findAvailableGroups() {
+ SystemManagerLocal manager = LookupUtil.getSystemManager();
+ manager.getSystemConfiguration();
+ Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
+ String[] names = { "bar", "foo" };
+
+ for (String name : names) {
+ Map<String, String> group = new HashMap<String, String>();
+ group.put("id", name);
+ group.put("name", name);
+ group.put("description", name);
+ ldapSet.add(group);
+ }
+ return ldapSet;
+ }
+
+ public Set<Map<String, String>> findAvailableGroupsFor(String userName) {
SystemManagerLocal manager = LookupUtil.getSystemManager();
manager.getSystemConfiguration();
Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
commit 4730f9bdaf6da619e1b4b5b61936bb3d5450725d
Merge: c4d4879... 3fcd671...
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 09:50:22 2010 -0500
Merge branch 'linux-config' into ldap
commit c4d48792e4876666f24ed0159562cb00eba3d3b0
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 8 09:49:26 2010 -0500
Added functionality to deal with roles
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index 6e0a31e..fc59516 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -27,16 +27,16 @@
</constraint>
</table>
- <table name="RHQ_ROLE_LDAP_GROUP_MAP">
+ <table name="RHQ_ROLE_LDAP_GROUP">
+ <column name="ID" default="sequence-only" initial="10001"
+ primarykey="true" required="true" type="INTEGER"/>
<column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
- <column name="LDAP_GROUP_NAME" required="true" type="VARCHAR2"/>
+ <column name="LDAP_GROUP_NAME" size="128" required="true" type="VARCHAR2"/>
- <constraint name="RHQ_ROLE_LDAP_GROUP_MAP_KEY">
- <primaryKey>
- <field ref="ROLE_ID"/>
- <field ref="LDAP_GROUP_NAME"/>
- </primaryKey>
- </constraint>
+ <index name="RHQ_ROLE_LDAP_GROUP_IDX" unique="true">
+ <field ref="ROLE_ID"/>
+ <field ref="LDAP_GROUP_NAME"/>
+ </index>
</table>
<table name="RHQ_PERMISSION">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 9b991cd..beb1703 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -240,6 +240,7 @@ public class Subject implements Externalizable {
private void init() {
roles = new HashSet<Role>();
+ ldapRoles = new HashSet<Role>();
}
/**
@@ -376,8 +377,15 @@ public class Subject implements Externalizable {
this.roles = roles;
}
- public void addRole(Role role) {
+ public void addRole(Role role, boolean isLdap) {
getRoles().add(role);
+ if (isLdap) {
+ getLdapRoles().add(role);
+ }
+ }
+
+ public void addRole(Role role) {
+ addRole(role, false);
}
public void removeRole(Role role) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index b7004bd..ada89a8 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -37,6 +37,7 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@@ -46,6 +47,7 @@ import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.resource.group.LdapGroup;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
@@ -110,6 +112,9 @@ public class Role implements Serializable {
@ManyToMany(mappedBy = "ldapRoles")
private java.util.Set<Subject> ldapSubjects = new HashSet<Subject>();
+ @OneToMany(mappedBy = "role", cascade = javax.persistence.CascadeType.ALL)
+ private Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
+
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@@ -181,6 +186,26 @@ public class Role implements Serializable {
return this.permissions.remove(permission);
}
+ public Set<LdapGroup> getLdapGroups() {
+ if (ldapGroups == null) {
+ ldapGroups = new HashSet<LdapGroup>();
+ }
+ return this.ldapGroups;
+ }
+
+ public void setLdapGroups(Set<LdapGroup> groups) {
+ this.ldapGroups = groups;
+ }
+
+ public void addLdapGroup(LdapGroup ldapGroup) {
+ ldapGroup.setRole(this);
+ this.ldapGroups.add(ldapGroup);
+ }
+
+ public boolean removeLdapGroup(LdapGroup ldapGroup) {
+ return this.ldapGroups.remove(ldapGroup);
+ }
+
public java.util.Set<Subject> getSubjects() {
return subjects;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
new file mode 100644
index 0000000..78fa9dc
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
@@ -0,0 +1,125 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.resource.group;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+import org.rhq.core.domain.authz.Role;
+
+/**
+ * @author paji
+ *
+ */
+@Entity
+@NamedQueries( { @NamedQuery(name = LdapGroup.DELETE_BY_ID, query = "DELETE FROM LdapGroup an WHERE an.id IN ( :ids )") })
+@Table(name = "RHQ_ROLE_LDAP_GROUP")
+@SequenceGenerator(name = "id", sequenceName = "RHQ_ROLE_LDAP_GROUP_ID_SEQ", allocationSize = 100)
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public class LdapGroup implements Serializable {
+ private static final long serialVersionUID = 1L;
+ public static final String DELETE_BY_ID = "LdapGroup.deleteById";
+ @Id
+ @Column(name = "ID", nullable = false)
+ @GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
+ private Integer id;
+
+ @ManyToOne
+ @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID", nullable = false)
+ private Role role;
+
+ @Column(name = "LDAP_GROUP_NAME", nullable = false)
+ private String name;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Transient
+ private String description = "";
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Role getRole() {
+ return role;
+ }
+
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ @Override
+ public int hashCode() {
+ return getName().hashCode() + 17 * ((role != null) ? role.hashCode() : 0);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+
+ if (!(o instanceof LdapGroup)) {
+ return false;
+ }
+ LdapGroup grp = (LdapGroup) o;
+ if (!getName().equals(grp.getName())) {
+ return false;
+ }
+
+ if (getRole() != null) {
+ return getRole().equals(grp.getRole());
+ }
+
+ return grp.getRole() == null;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
index 4f35fe6..237858d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
@@ -568,7 +568,7 @@ public class SystemConfigForm extends BaseValidatorForm {
public void setLdapSearchFilter(String s) {
ldapSearchFilter = s;
}
-
+
public String getLdapGroupFilter() {
return ldapGroupFilter;
}
@@ -578,7 +578,7 @@ public class SystemConfigForm extends BaseValidatorForm {
}
public String getLdapGroupMember() {
- return ldapGroupFilter;
+ return ldapGroupMember;
}
public void setLdapGroupMember(String s) {
@@ -609,7 +609,6 @@ public class SystemConfigForm extends BaseValidatorForm {
this.reindex = reindex;
}
-
/* (non-Javadoc)
* @see org.apache.struts.action.ActionForm#validate(org.apache.struts.action.ActionMapping,
* javax.servlet.http.HttpServletRequest)
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java
new file mode 100644
index 0000000..fe91d46
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsAction.java
@@ -0,0 +1,87 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import org.rhq.enterprise.gui.legacy.Constants;
+import org.rhq.enterprise.gui.legacy.action.BaseAction;
+import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
+import org.rhq.enterprise.gui.legacy.util.RequestUtils;
+import org.rhq.enterprise.gui.legacy.util.SessionUtils;
+import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * An Action that adds resource groups for a role.
+ */
+public class AddLdapGroupsAction extends BaseAction {
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+ Log log = LogFactory.getLog(AddLdapGroupsAction.class.getName());
+ HttpSession session = request.getSession();
+
+ AddLdapGroupsForm addForm = (AddLdapGroupsForm) form;
+ Integer roleId = addForm.getR();
+
+ ActionForward forward = checkSubmit(request, mapping, form, Constants.ROLE_PARAM, roleId);
+ if (forward != null) {
+ BaseValidatorForm spiderForm = (BaseValidatorForm) form;
+
+ if (spiderForm.isCancelClicked() || spiderForm.isResetClicked()) {
+ log.debug("removing pending group list");
+ SessionUtils.removeList(session, Constants.PENDING_RESGRPS_SES_ATTR);
+ } else if (spiderForm.isAddClicked()) {
+ log.debug("adding to pending group list");
+ SessionUtils.addToList(session, Constants.PENDING_RESGRPS_SES_ATTR, addForm.getAvailableGroups());
+ } else if (spiderForm.isRemoveClicked()) {
+ log.debug("removing from pending group list");
+ SessionUtils.removeFromList(session, Constants.PENDING_RESGRPS_SES_ATTR, addForm.getPendingGroups());
+ }
+
+ return forward;
+ }
+
+ log.debug("getting pending group list");
+ List<String> pendingGroupIds = SessionUtils.getListAsListStr(request.getSession(),
+ Constants.PENDING_RESGRPS_SES_ATTR);
+ for (String id : pendingGroupIds) {
+ log.debug("adding group [" + id + "] for role [" + roleId + "]");
+ }
+
+ RoleManagerLocal roleManager = LookupUtil.getRoleManager();
+ roleManager.addLdapGroupsToRole(RequestUtils.getSubject(request), roleId, pendingGroupIds);
+
+ log.debug("removing pending group list");
+ SessionUtils.removeList(session, Constants.PENDING_RESGRPS_SES_ATTR);
+
+ RequestUtils.setConfirmation(request, "admin.role.confirm.AddLdapGroups");
+ return returnSuccess(request, mapping, Constants.ROLE_PARAM, roleId);
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java
new file mode 100644
index 0000000..4740012
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsForm.java
@@ -0,0 +1,139 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.action.ActionMapping;
+
+import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
+
+/**
+ * A subclass of <code>Spider</code> representing the <em>Add Role Resource Groups</em> form.
+ */
+public class AddLdapGroupsForm extends BaseValidatorForm {
+ //-------------------------------------instance variables
+
+ private String[] availableGroups;
+ private String[] pendingGroups;
+ private Integer psa;
+ private Integer psp;
+ private Integer r;
+
+ //-------------------------------------constructors
+
+ public AddLdapGroupsForm() {
+ super();
+ }
+
+ //-------------------------------------public methods
+
+ public String[] getAvailableGroup() {
+ return this.availableGroups;
+ }
+
+ public String[] getAvailableGroups() {
+ return getAvailableGroup();
+ }
+
+ public void setAvailableGroup(String[] availableGroups) {
+ this.availableGroups = availableGroups;
+ }
+
+ public void setAvailableGroups(String[] availableGroups) {
+ setAvailableGroup(availableGroups);
+ }
+
+ public String[] getPendingGroup() {
+ return this.pendingGroups;
+ }
+
+ public String[] getPendingGroups() {
+ return getPendingGroup();
+ }
+
+ public void setPendingGroup(String[] pendingGroups) {
+ this.pendingGroups = pendingGroups;
+ }
+
+ public void setPendingGroups(String[] pendingGroups) {
+ setPendingGroup(pendingGroups);
+ }
+
+ public Integer getPsa() {
+ return this.psa;
+ }
+
+ public void setPsa(Integer ps) {
+ this.psa = ps;
+ }
+
+ public Integer getPsp() {
+ return this.psp;
+ }
+
+ public void setPsp(Integer ps) {
+ this.psp = ps;
+ }
+
+ public Integer getR() {
+ return this.r;
+ }
+
+ public void setR(Integer r) {
+ this.r = r;
+ }
+
+ public void reset(ActionMapping mapping, HttpServletRequest request) {
+ super.reset(mapping, request);
+ this.psa = null;
+ this.psp = null;
+ this.r = null;
+ this.pendingGroups = new String[0];
+ this.availableGroups = new String[0];
+ }
+
+ public String toString() {
+ StringBuilder s = new StringBuilder(super.toString());
+ s.append("r=" + r + " ");
+ s.append("psa=" + psa + " ");
+ s.append("psp=" + psp + " ");
+
+ s.append("availableGroups={");
+ listToString(s, availableGroups);
+ s.append("} ");
+
+ s.append("pendingGroups={");
+ listToString(s, pendingGroups);
+ s.append("}");
+
+ return s.toString();
+ }
+
+ private void listToString(StringBuilder s, String[] l) {
+ if (l != null) {
+ for (int i = 0; i < l.length; i++) {
+ s.append(l[i]);
+ if (i < (l.length - 1)) {
+ s.append(", ");
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
new file mode 100644
index 0000000..c673cb5
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/AddLdapGroupsFormPrepareAction.java
@@ -0,0 +1,149 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.tiles.ComponentContext;
+import org.apache.struts.tiles.actions.TilesAction;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.resource.group.LdapGroup;
+import org.rhq.core.domain.util.PageControl;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.legacy.Constants;
+import org.rhq.enterprise.gui.legacy.util.RequestUtils;
+import org.rhq.enterprise.gui.legacy.util.SessionUtils;
+import org.rhq.enterprise.gui.util.WebUtility;
+import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManager;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * An Action that retrieves data to facilitate display of the form for adding groups to a role.
+ */
+public class AddLdapGroupsFormPrepareAction extends TilesAction {
+ public ActionForward execute(ComponentContext context, ActionMapping mapping, ActionForm form,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+ Log log = LogFactory.getLog(AddLdapGroupsFormPrepareAction.class.getName());
+
+ Subject whoami = RequestUtils.getSubject(request);
+ AddLdapGroupsForm addForm = (AddLdapGroupsForm) form;
+ Integer roleId = addForm.getR();
+
+ if (roleId == null) {
+ roleId = RequestUtils.getRoleId(request);
+ }
+
+ Role role = (Role) request.getAttribute(Constants.ROLE_ATTR);
+ if (role == null) {
+ RequestUtils.setError(request, Constants.ERR_ROLE_NOT_FOUND);
+ return null;
+ }
+
+ addForm.setR(role.getId());
+
+ PageControl pca = WebUtility.getPageControl(request, "a");
+ PageControl pcp = WebUtility.getPageControl(request, "p");
+
+ /* pending groups are those on the right side of the "add
+ * to list" widget- awaiting association with the rolewhen the form's "ok" button is clicked. */
+ List<String> pendingGroupIds = SessionUtils.getListAsListStr(request.getSession(),
+ Constants.PENDING_RESGRPS_SES_ATTR);
+
+ log.trace("getting pending groups for role [" + roleId + ")");
+ String name = "foo";
+ Set<Map<String, String>> allGroups = LdapGroupManager.getInstance().findAvailableGroupsByRole(whoami,
+ role.getId());
+ RoleManagerLocal roleManager = LookupUtil.getRoleManager();
+
+ PageList<LdapGroup> assignedList = roleManager.findLdapGroupsByRole(role.getId(), PageControl
+ .getUnlimitedInstance());
+
+ allGroups = filterExisting(assignedList, allGroups);
+ Set<String> pendingIds = new HashSet<String>(pendingGroupIds);
+
+ Set<Map<String, String>> pendingSet = findPendingGroups(pendingIds, allGroups);
+ PageList<Map<String, String>> pendingGroups = new PageList<Map<String, String>>(pendingSet, pendingSet.size(),
+ pcp);
+
+ request.setAttribute(Constants.PENDING_RESGRPS_ATTR, pendingGroups);
+ request.setAttribute(Constants.NUM_PENDING_RESGRPS_ATTR, new Integer(pendingGroups.getTotalSize()));
+
+ /* available groups are all groups in the system that are not
+ * associated with the role and are not pending
+ */
+ log.trace("getting available groups for role [" + roleId + "]");
+
+ Set<Map<String, String>> availableGroupsSet = findAvailableGroups(pendingIds, allGroups);
+ PageList<Map<String, String>> availableGroups = new PageList<Map<String, String>>(availableGroupsSet,
+ availableGroupsSet.size(), pca);
+ request.setAttribute(Constants.AVAIL_RESGRPS_ATTR, availableGroups);
+ request.setAttribute(Constants.NUM_AVAIL_RESGRPS_ATTR, new Integer(availableGroups.getTotalSize()));
+
+ return null;
+ }
+
+ private Set<Map<String, String>> findPendingGroups(Set<String> pending, Set<Map<String, String>> allGroups) {
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
+ for (Map<String, String> group : allGroups) {
+ if (pending.contains(group.get("name"))) {
+ ret.add(group);
+ }
+ }
+ return ret;
+ }
+
+ private Set<Map<String, String>> findAvailableGroups(Set<String> pending, Set<Map<String, String>> allGroups) {
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
+ for (Map<String, String> group : allGroups) {
+ if (!pending.contains(group.get("name"))) {
+ ret.add(group);
+ }
+ }
+ return ret;
+ }
+
+ private Set<Map<String, String>> filterExisting(List<LdapGroup> pendingItems, Set<Map<String, String>> allGroups) {
+ Set<String> pending = new HashSet<String>();
+ for (LdapGroup group : pendingItems) {
+ pending.add(group.getName());
+ }
+
+ Set<Map<String, String>> ret = new HashSet<Map<String, String>>();
+ for (Map<String, String> group : allGroups) {
+ if (!pending.contains(group.get("name"))) {
+ ret.add(group);
+ }
+ }
+ return ret;
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java
new file mode 100644
index 0000000..fb359c6
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveLdapGroupsAction.java
@@ -0,0 +1,54 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.admin.role;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+
+import org.rhq.core.util.collection.ArrayUtils;
+import org.rhq.enterprise.gui.legacy.Constants;
+import org.rhq.enterprise.gui.legacy.action.BaseAction;
+import org.rhq.enterprise.gui.legacy.util.RequestUtils;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * An Action that retrieves data to facilitate display of the form for removing groups to a role.
+ */
+public class RemoveLdapGroupsAction extends BaseAction {
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+ Log log = LogFactory.getLog(RemoveLdapGroupsAction.class.getName());
+
+ RemoveResourceGroupsForm rmForm = (RemoveResourceGroupsForm) form;
+ int roleId = rmForm.getR();
+ int[] groupIds = ArrayUtils.unwrapArray(rmForm.getLdapGroups());
+
+ log.debug("removing groups " + groupIds + "] for role [" + roleId + "]");
+ LookupUtil.getRoleManager().removeLdapGroupsFromRole(RequestUtils.getSubject(request), roleId, groupIds);
+
+ RequestUtils.setConfirmation(request, "admin.role.confirm.RemoveLdapGroups");
+ return returnSuccess(request, mapping, Constants.ROLE_PARAM, roleId);
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java
index 578136d..3ce789d 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RemoveResourceGroupsForm.java
@@ -19,7 +19,9 @@
package org.rhq.enterprise.gui.admin.role;
import javax.servlet.http.HttpServletRequest;
+
import org.apache.struts.action.ActionMapping;
+
import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
/**
@@ -28,6 +30,9 @@ import org.rhq.enterprise.gui.legacy.action.BaseValidatorForm;
public class RemoveResourceGroupsForm extends BaseValidatorForm {
//-------------------------------------instance variables
+ private Integer[] ldapGroups;
+ private Integer ldapGroupPageSize;
+
private Integer[] groups;
private Integer r;
@@ -51,6 +56,14 @@ public class RemoveResourceGroupsForm extends BaseValidatorForm {
this.groups = groups;
}
+ public void setLdapGroups(Integer[] groups) {
+ this.ldapGroups = groups;
+ }
+
+ public Integer[] getLdapGroups() {
+ return ldapGroups;
+ }
+
public Integer getPsg() {
return getPs();
}
@@ -59,6 +72,14 @@ public class RemoveResourceGroupsForm extends BaseValidatorForm {
setPs(pageSize);
}
+ public Integer getPsldapGroups() {
+ return ldapGroupPageSize;
+ }
+
+ public void setPsldapGroups(Integer pageSize) {
+ ldapGroupPageSize = pageSize;
+ }
+
public Integer getR() {
return this.r;
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java
index 2918c1d..b637b98 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/RoleAdminPortalAction.java
@@ -20,14 +20,17 @@ package org.rhq.enterprise.gui.admin.role;
import java.util.HashMap;
import java.util.Properties;
+
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
+
import org.rhq.core.domain.authz.Role;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.Portal;
@@ -55,6 +58,9 @@ public class RoleAdminPortalAction extends BaseDispatchAction {
private static final String TITLE_ADD_GROUPS = "admin.role.AddRoleGroupsTitle";
private static final String PORTLET_ADD_GROUPS = ".admin.role.AddGroups";
+ private static final String TITLE_ADD_LDAP_GROUPS = "admin.role.AddRoleLdapGroupsTitle";
+ private static final String PORTLET_ADD_LDAP_GROUPS = ".admin.role.AddLdapGroups";
+
private static final String TITLE_EDIT = "admin.role.EditRoleTitle";
private static final String PORTLET_EDIT = ".admin.role.Edit";
@@ -78,6 +84,7 @@ public class RoleAdminPortalAction extends BaseDispatchAction {
keyMethodMap.setProperty(Constants.MODE_LIST, "listRoles");
keyMethodMap.setProperty(Constants.MODE_ADD_USERS, "addRoleUsers");
keyMethodMap.setProperty(Constants.MODE_ADD_GROUPS, "addRoleGroups");
+ keyMethodMap.setProperty(Constants.MODE_ADD_LDAP_GROUPS, "addLdapGroups");
keyMethodMap.setProperty(Constants.MODE_EDIT, "editRole");
keyMethodMap.setProperty(Constants.MODE_NEW, "newRole");
keyMethodMap.setProperty(Constants.MODE_VIEW, "viewRole");
@@ -121,6 +128,17 @@ public class RoleAdminPortalAction extends BaseDispatchAction {
return null;
}
+ public ActionForward addLdapGroups(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+ setRole(request);
+
+ Portal portal = Portal.createPortal(TITLE_ADD_LDAP_GROUPS, PORTLET_ADD_LDAP_GROUPS);
+ portal.setDialog(true);
+ request.setAttribute(Constants.PORTAL_KEY, portal);
+
+ return null;
+ }
+
public ActionForward editRole(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
setRole(request);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java
index dd53eed..3414dab 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/role/ViewAction.java
@@ -35,6 +35,7 @@ import org.apache.struts.tiles.ComponentContext;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.AuthzConstants;
import org.rhq.core.domain.util.PageControl;
@@ -69,8 +70,10 @@ public class ViewAction extends WorkflowPrepareAction {
Subject whoami = RequestUtils.getSubject(request);
PageControl pcu = WebUtility.getPageControl(request, "u");
PageControl pcg = WebUtility.getPageControl(request, "g");
+ PageControl pcldap = WebUtility.getPageControl(request, "l");
log.trace("user page control: " + pcu);
log.trace("group page control: " + pcg);
+ log.trace("ldap group page control: " + pcldap);
RoleManagerLocal roleManager = LookupUtil.getRoleManager();
ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager();
@@ -101,6 +104,14 @@ public class ViewAction extends WorkflowPrepareAction {
request.setAttribute(Constants.NUM_RESGRPS_ATTR, new Integer(groups.getTotalSize()));
}
+ PageList<LdapGroup> ldapGroups = roleManager.findLdapGroupsByRole(roleId, pcldap);
+ request.setAttribute(Constants.ROLE_LDAPGRPS_ATTR, ldapGroups);
+ if (ldapGroups == null) {
+ request.setAttribute(Constants.NUM_LDAPGRPS_ATTR, new Integer(0));
+ } else {
+ request.setAttribute(Constants.NUM_LDAPGRPS_ATTR, new Integer(ldapGroups.getTotalSize()));
+ }
+
// create and initialize the remove users form
RemoveUsersForm rmUsersForm = new RemoveUsersForm();
rmUsersForm.setR(roleId);
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java
index 5c82d46..6c87a4f 100755
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/AttrConstants.java
@@ -233,6 +233,12 @@ public interface AttrConstants {
public static final String ROLE_RESGRPS_ATTR = "RoleResGrps";
/**
+ * The request scope attribute under which actions store the <code>List</code> of <code>LDAPGroupValue</code>
+ * objects for the requested role.
+ */
+ public static final String ROLE_LDAPGRPS_ATTR = "RoleLdapGrps";
+
+ /**
* The request scope attribute under which actions store the number of <code>AuthzSubjectValue</code> objects in the
* associated <code>List</code>.
*/
@@ -298,6 +304,12 @@ public interface AttrConstants {
public static final String NUM_RESGRPS_ATTR = "NumResGrps";
/**
+ * The request scope attribute under which actions store the number of <code>LdapGroupValue</code> objects in
+ * the associated <code>List</code>.
+ */
+ public static final String NUM_LDAPGRPS_ATTR = "NumLdapGrps";
+
+ /**
* The request scope attribute under which actions store the full <code>List</code> of <code>
* ResourceGroupValue</code> objects.
*/
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java
index a659e89..8847962 100755
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/legacy/ParamConstants.java
@@ -457,6 +457,12 @@ public interface ParamConstants {
/**
* a value for a standard request paramater mode.<br>
+ * signify adding ldap groups for a role.
+ */
+ public static final String MODE_ADD_LDAP_GROUPS = "addLdapGroups";
+
+ /**
+ * a value for a standard request paramater mode.<br>
* signify displaying a list of items
*/
public static final String MODE_ADD = "add";
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 e95869f..62af674 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
@@ -280,6 +280,7 @@ admin.role.ViewRoleTitle=${product.shortName} View Role - {0}
admin.role.EditRoleTitle=${product.shortName} Edit Role Properties and Permissions - {0}
admin.role.AddRoleUsersTitle=${product.shortName} Edit Role Assign Users To Role - {0}
admin.role.AddRoleGroupsTitle=${product.shortName} Edit Role Assign Groups To Role - {0}
+admin.role.AddRoleLdapGroupsTitle=${product.shortName} Edit Role Assign LDAP Groups To Role - {0}
admin.role.AlertNotificationTimeRangeTitle=${product.shortName} Edit Role Alert Notification Time Range - {0}
admin.role.ChangeRoleOwnerTitle=${product.shortName} Change Owner - {0}
admin.role.error.StaticRole=You cannot alter the roles for one or more of these users
@@ -342,7 +343,8 @@ admin.role.add.users=Edit {0}: Assign Users to Role
admin.role.groups.GroupsTab=Groups
admin.role.groups.AssignToRoleTab=Assign To Role
admin.role.groups.NewResourceGroupButton=New Group...
-admin.role.groups.AssignedGroupsTab=Assigned Groups
+admin.role.groups.AssignedGroupsTab=Assigned Resource Groups
+admin.role.groups.AssignedLdapGroupsTab=Assigned LDAP Groups
#
admin.role.list.NameTH=Name
admin.role.list.OwnerTH=Owner
@@ -362,9 +364,11 @@ admin.role.confirm.Create=Role {0} has been created.
admin.role.confirm.Edit=Your changes have been saved.
admin.role.confirm.AddUsers=The requested users have been assigned to the role.
admin.role.confirm.AddResourceGroups=The requested groups have been assigned to the role.
+admin.role.confirm.AddLdapGroups=The requested groups have been assigned to the role.
admin.role.confirm.Remove=The requested roles have been removed.
admin.role.confirm.RemoveUsers=The requested users have been removed.
admin.role.confirm.RemoveResourceGroups=The requested groups have been removed.
+admin.role.confirm.RemoveLdapGroups=The requested groups have been removed.
admin.role.confirm.ChangeOwner=The owner has been changed.
#
admin.role.error.RoleNotFound=The specified role does not exist.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml
index 76321ce..d18f2d4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/struts-config.xml
@@ -30,6 +30,8 @@
type="org.rhq.enterprise.gui.admin.role.RemoveUsersForm"/>
<form-bean name="AddRoleResourceGroupsForm"
type="org.rhq.enterprise.gui.admin.role.AddResourceGroupsForm"/>
+ <form-bean name="AddRoleLdapGroupsForm"
+ type="org.rhq.enterprise.gui.admin.role.AddLdapGroupsForm"/>
<form-bean name="RemoveRoleResourceGroupsForm"
type="org.rhq.enterprise.gui.admin.role.RemoveResourceGroupsForm"/>
<!-- / -->
@@ -546,6 +548,46 @@
<forward name="failure" path="/admin/role/RoleAdmin.do?mode=view"/>
<forward name="success" path="/admin/role/RoleAdmin.do?mode=view"/>
</action>
+
+
+ <action path="/admin/role/AddLdapGroupsFormPrepare"
+ name="AddRoleLdapGroupsForm"
+ scope="request"
+ type="org.rhq.enterprise.gui.admin.role.AddLdapGroupsFormPrepareAction">
+ <set-property property="title" value="Add+Resource+Group"/>
+ </action>
+
+ <action path="/admin/role/AddLdapGroups"
+ type="org.rhq.enterprise.gui.admin.role.AddLdapGroupsAction"
+ name="AddRoleLdapGroupsForm"
+ scope="request"
+ input="/admin/role/RoleAdmin.do?mode=addLdapGroups">
+ <set-property property="workflow" value="role/ViewUser"/>
+ <forward name="cancel" path="/admin/role/RoleAdmin.do?mode=view"
+ redirect="true"/>
+ <forward name="reset" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"
+ redirect="true"/>
+ <forward name="new" path="/resource/group/Inventory.do?mode=new" redirect="true"/>
+ <forward name="add" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <forward name="remove" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <forward name="failure" path="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <forward name="success" path="/admin/role/RoleAdmin.do?mode=view"/>
+ </action>
+
+ <action path="/admin/role/RemoveLdapGroups"
+ type="org.rhq.enterprise.gui.admin.role.RemoveLdapGroupsAction"
+ name="RemoveRoleResourceGroupsForm"
+ scope="request"
+ input="/admin/role/RoleAdmin.do?mode=view">
+ <forward name="failure" path="/admin/role/RoleAdmin.do?mode=view"/>
+ <forward name="success" path="/admin/role/RoleAdmin.do?mode=view"/>
+ </action>
+
+
+
+
+
+
<!-- / -->
<action path="/admin/role/ChangeOwnerFormPrepare"
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml
index 6dac0a0..0559198 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/tiles/admin-def.xml
@@ -73,6 +73,10 @@
controllerUrl="/admin/role/AddResourceGroupsFormPrepare.do"
path="/admin/role/AddRoleGroups.jsp"/>
+ <definition name=".admin.role.AddLdapGroups"
+ controllerUrl="/admin/role/AddLdapGroupsFormPrepare.do"
+ path="/admin/role/AddLdapRoleGroups.jsp"/>
+
<definition name=".admin.role.ChangeOwner"
controllerUrl="/admin/role/ChangeOwnerFormPrepare.do"
path="/admin/role/ChangeRoleOwner.jsp"/>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp
new file mode 100644
index 0000000..93ec22e
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/AddLdapRoleGroups.jsp
@@ -0,0 +1,30 @@
+<%@ page language="java" %>
+<%@ page errorPage="/common/Error.jsp" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>
+
+<html:form action="/admin/role/AddLdapGroups" method="POST">
+
+<tiles:insert definition=".page.title.admin.role">
+ <tiles:put name="titleName" beanName="Role" beanProperty="name"/>
+</tiles:insert>
+
+<tiles:insert definition=".portlet.error"/>
+
+<tiles:insert page="/admin/role/RoleGroupsForm.jsp">
+ <tiles:put name="availableResGrps" beanName="AvailableResGrps"/>
+ <tiles:put name="numAvailableResGrps" beanName="NumAvailableResGrps"/>
+ <tiles:put name="pendingResGrps" beanName="PendingResGrps"/>
+ <tiles:put name="numPendingResGrps" beanName="NumPendingResGrps"/>
+</tiles:insert>
+
+<tiles:insert definition=".form.buttons">
+ <tiles:put name="addToList" value="true"/>
+</tiles:insert>
+
+<tiles:insert definition=".page.footer"/>
+
+<html:hidden property="r"/>
+</html:form>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
index 1909ec5..ff4d6f6 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
@@ -12,12 +12,15 @@
<script language="JavaScript" src="<html:rewrite page="/js/listWidget.js"/>" type="text/javascript"></script>
<c:set var="userWidgetInstanceName" value="assignedUsers"/>
<c:set var="groupWidgetInstanceName" value="assignedGroups"/>
+<c:set var="ldapGroupWidgetInstanceName" value="assignedLdapGroups"/>
<script type="text/javascript">
var pageData = new Array();
initializeWidgetProperties('<c:out value="${userWidgetInstanceName}"/>');
userWidgetProperties = getWidgetProperties('<c:out value="${userWidgetInstanceName}"/>');
initializeWidgetProperties('<c:out value="${groupWidgetInstanceName}"/>');
groupWidgetProperties = getWidgetProperties('<c:out value="${groupWidgetInstanceName}"/>');
+initializeWidgetProperties('<c:out value="${ldapGroupWidgetInstanceName}"/>');
+ldapGroupWidgetProperties = getWidgetProperties('<c:out value="${ldapGroupWidgetInstanceName}"/>');
</script>
<c:url var="selfPuAction" value="/admin/role/RoleAdmin.do">
@@ -179,25 +182,24 @@ groupWidgetProperties = getWidgetProperties('<c:out value="${groupWidgetInstance
<html:form method="POST" action="/admin/role/RemoveLdapGroups">
<tiles:insert definition=".header.tab">
- <tiles:put name="tabKey" value="admin.role.groups.AssignedGroupsTab"/>
+ <tiles:put name="tabKey" value="admin.role.groups.AssignedLdapGroupsTab"/>
</tiles:insert>
<display:table items="${RoleLdapGrps}" var="group" action="${selfPgAction}"
- postfix="g"
+ postfix="ldapGroups"
width="100%" cellpadding="0" cellspacing="0">
- <display:column width="1%" property="id" title="<input type=\"checkbox\" onclick=\"ToggleAll(this, groupWidgetProperties, true)\" name=\"listToggleAll\">" isLocalizedTitle="false" styleClass="ListCellCheckbox" headerStyleClass="ListHeaderCheckbox" >
- <display:checkboxdecorator name="g" onclick="ToggleSelection(this, groupWidgetProperties, true)" styleClass="listMember"/>
+ <display:column width="1%" property="id" title="<input type=\"checkbox\" onclick=\"ToggleAll(this, ldapGroupWidgetProperties, true)\" name=\"listToggleAll\">" isLocalizedTitle="false" styleClass="ListCellCheckbox" headerStyleClass="ListHeaderCheckbox" >
+ <display:checkboxdecorator name="ldapGroups" onclick="ToggleSelection(this, ldapGroupWidgetProperties, true)" styleClass="listMember"/>
</display:column>
- <display:column width="25%" property="name" href="/rhq/group/inventory/view.xhtml?category=${group.groupCategory.name}&groupId=${group.id}" title="common.header.Group"
- sortAttr="r.name"/>
- <display:column width="75%" property="description" title="common.header.Description"/>
+ <display:column property="name" title="common.header.Group" sortAttr="r.name"/>
+
</display:table>
<tiles:insert definition=".toolbar.addToList">
<tiles:put name="addToListUrl" value="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
- <tiles:put name="widgetInstanceName" beanName="groupWidgetInstanceName"/>
+ <tiles:put name="widgetInstanceName" beanName="ldapGroupWidgetInstanceName"/>
<tiles:put name="addToListParamName" value="r"/>
<tiles:put name="addToListParamValue" beanName="Role" beanProperty="id"/>
<tiles:put name="pageList" beanName="RoleLdapGrps"/>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index 8762845..bcf7738 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.server.authz;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@@ -38,6 +39,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -88,6 +90,15 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
return roles;
}
+ @Override
+ public PageList<LdapGroup> findLdapGroupsByRole(int roleId, PageControl pageControl) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to lookup ldap Groups on");
+ }
+ return new PageList<LdapGroup>(role.getLdapGroups(), role.getLdapGroups().size(), pageControl);
+ }
+
/**
* @see org.rhq.enterprise.server.authz.RoleManagerLocal#findRoles(PageControl)
*/
@@ -431,6 +442,63 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
}
+ /**
+ * @see org.rhq.enterprise.server.authz.RoleManagerLocal#addResourceGroupsToRole(Subject, int, int[])
+ */
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupIds) {
+ if ((groupIds != null) && (groupIds.size() > 0)) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to add resourceGroups to");
+ }
+ role.getLdapGroups().size(); // load them in
+
+ for (String groupId : groupIds) {
+ LdapGroup group = new LdapGroup();
+ group.setName(groupId);
+ if (role == null) {
+ throw new IllegalArgumentException("Tried to add ldapGroup[" + groupId + "] to role[" + roleId
+ + "], but resourceGroup was not found");
+ }
+ role.addLdapGroup(group);
+ }
+ }
+ }
+
+ /**
+ * @see org.rhq.enterprise.server.authz.RoleManagerLocal#removeLdapGroupsFromRole(Subject, int, int[])
+ */
+
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void removeLdapGroupsFromRole(Subject subject, int roleId, int[] groupIds) {
+ if ((groupIds != null) && (groupIds.length > 0)) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to remove resourceGroups from");
+ }
+ role.getLdapGroups().size(); // load them in
+
+ for (Integer groupId : groupIds) {
+ LdapGroup doomedGroup = entityManager.find(LdapGroup.class, groupId);
+ if (doomedGroup == null) {
+ throw new IllegalArgumentException("Tried to remove doomedGroup[" + groupId + "] from role["
+ + roleId + "], but subject was not found");
+ }
+ role.removeLdapGroup(doomedGroup);
+ }
+
+ Query purgeQuery = entityManager.createNamedQuery(LdapGroup.DELETE_BY_ID);
+
+ List<Integer> ids = new LinkedList<Integer>();
+ for (int i : groupIds) {
+ ids.add(i);
+ }
+ purgeQuery.setParameter("ids", ids);
+ purgeQuery.executeUpdate();
+ }
+ }
+
private void processDependentPermissions(Role role) {
/*
* if you can control user/roles, then you can give yourself permissions, too; so we might as well
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
index 58f962a..34b81e0 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.authz;
+import java.util.List;
import java.util.Set;
import javax.ejb.Local;
@@ -26,6 +27,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -159,6 +161,8 @@ public interface RoleManagerLocal {
Role getRole(Subject subject, int roleId);
+ PageList<LdapGroup> findLdapGroupsByRole(int roleId, PageControl pageControl);
+
PageList<Role> findSubjectAssignedRoles(Subject subject, int subjectId, PageControl pc);
//This is a proxy of getAvailableRolesForSubject but without pendingRoleIds as required by remote spec
@@ -198,6 +202,8 @@ public interface RoleManagerLocal {
void addRolesToResourceGroup(Subject subject, int groupId, int[] roleIds);
+ void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupIds);
+
/**
* Removes the given resource groups from the given role.
*
@@ -209,6 +215,8 @@ public interface RoleManagerLocal {
void removeRolesFromResourceGroup(Subject subject, int groupId, int[] roleIds);
+ void removeLdapGroupsFromRole(Subject subject, int roleId, int[] groupIds);
+
PageList<Role> findRolesByCriteria(Subject subject, RoleCriteria criteria);
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
index 12d0787..2c98b0a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
@@ -166,6 +166,8 @@ public class CustomJaasDeploymentService implements CustomJaasDeploymentServiceM
configOptions.put(Context.SECURITY_PROTOCOL, conf.getProperty(RHQConstants.LDAPProtocol));
configOptions.put("LoginProperty", conf.getProperty(RHQConstants.LDAPLoginProperty));
configOptions.put("Filter", conf.getProperty(RHQConstants.LDAPFilter));
+ configOptions.put("GroupFilter", conf.getProperty(RHQConstants.LDAPGroupFilter));
+ configOptions.put("GroupMemberFilter", conf.getProperty(RHQConstants.LDAPGroupMember));
configOptions.put("BaseDN", conf.getProperty(RHQConstants.LDAPBaseDN));
configOptions.put("BindDN", conf.getProperty(RHQConstants.LDAPBindDN));
configOptions.put("BindPW", conf.getProperty(RHQConstants.LDAPBindPW));
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
new file mode 100644
index 0000000..86bd8b4
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManager.java
@@ -0,0 +1,290 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.resource.group;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+import javax.naming.ldap.InitialLdapContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.system.SystemManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.security.UntrustedSSLSocketFactory;
+
+/**
+ * @author paji
+ *
+ */
+public class LdapGroupManager {
+ private static final LdapGroupManager INSTANCE = new LdapGroupManager();
+ private static final String BASEDN_DELIMITER = ";";
+ private Log log = LogFactory.getLog(LdapGroupManager.class);
+
+ private LdapGroupManager() {
+ }
+
+ public static LdapGroupManager getInstance() {
+ return INSTANCE;
+ }
+
+ public Set<Map<String, String>> findAvailableGroupsByRole(Subject subject, int roleId) {
+ SystemManagerLocal manager = LookupUtil.getSystemManager();
+ manager.getSystemConfiguration();
+ Set<Map<String, String>> ldapSet = new HashSet<Map<String, String>>();
+ String[] names = { "bar", "foo" };
+
+ for (String name : names) {
+ Map<String, String> group = new HashMap<String, String>();
+ group.put("id", name);
+ group.put("name", name);
+ group.put("description", name);
+ ldapSet.add(group);
+ }
+ return ldapSet;
+ }
+
+ /*
+ *
+ {BindDN=uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com,
+ java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory, jboss.security.security_domain=JON,
+ LoginProperty=uid, BaseDN=dc=rhndev,dc=redhat,dc=com, java.naming.provider.url=ldap://fjs-0-16.rhndev.redhat.com,
+ java.naming.security.protocol=, BindPW=dog8code}
+ */
+ protected boolean test() throws Exception {
+
+ // Load our LDAP specific properties
+ Properties env = null;// getProperties();
+
+ // Load the BaseDN
+ String baseDN = "dc=rhndev,dc=redhat,dc=com";
+
+ // Load the LoginProperty
+ String loginProperty = "uid";
+
+ // Load any search filter
+
+ // Find the user that is calling us
+ String userName = "sdoo";
+
+ // Load any information we may need to bind
+ String bindDN = "uid=shaggy,ou=People, dc=rhndev, dc=redhat, dc=com";
+ String bindPW = "dog8code";
+
+ if (bindDN != null) {
+ env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
+ env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
+ env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
+ }
+ InitialLdapContext ctx = new InitialLdapContext(env, null);
+ SearchControls searchControls = getSearchControls();
+
+ // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
+ String filter;
+ /* if ((searchFilter != null) && (searchFilter.length() != 0)) {
+ filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
+ } else {
+ filter = "(" + loginProperty + "=" + userName + ")";
+ }
+ */
+ //filter = "(" + loginProperty + "=" + userName + ")";
+ filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
+ + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
+
+ // Loop through each configured base DN. It may be useful
+ // in the future to allow for a filter to be configured for
+ // each BaseDN, but for now the filter will apply to all.
+ String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+ log.info(Arrays.asList(baseDNs));
+ for (int x = 0; x < baseDNs.length; x++) {
+ NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ log.info(answer.hasMore());
+ while (answer.hasMore()) {
+ // We use the first match
+ SearchResult si = (SearchResult) answer.next();
+ log.info(si);
+
+ /*
+ // Construct the UserDN
+ String userDN = si.getName() + "," + baseDNs[x];
+ print (userDN);
+ ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN);
+ ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, "dog8code");
+ ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
+ ctx.reconnect(null);*/
+ }
+
+ }
+
+ // If we try all the BaseDN's and have not found a match, return false
+ return false;
+ }
+
+ /**
+ * @see org.jboss.security.auth.spi.UsernamePasswordLoginModule#validatePassword(java.lang.String,java.lang.String)
+ */
+ protected void buildGroup(Properties options, String userName) {
+ // Load our LDAP specific properties
+ Properties env = getProperties(options);
+
+ // Load the BaseDN
+ String baseDN = (String) options.get(RHQConstants.LDAPBaseDN);
+ if (baseDN == null) {
+ // If the BaseDN is not specified, log an error and refuse the login attempt
+ log.info("BaseDN is not set, refusing login");
+ }
+
+ // Load the LoginProperty
+ String loginProperty = (String) options.get(RHQConstants.LDAPLoginProperty);
+ if (loginProperty == null) {
+ // Use the default
+ loginProperty = "cn";
+ }
+
+ String groupFilter = (String) options.get("groupFilter");
+ String groupMember = (String) options.get("groupMember");
+
+ // Load any information we may need to bind
+ String bindDN = (String) options.get("BindDN");
+ String bindPW = (String) options.get("BindPW");
+ if (bindDN != null) {
+ env.setProperty(Context.SECURITY_PRINCIPAL, bindDN);
+ env.setProperty(Context.SECURITY_CREDENTIALS, bindPW);
+ env.setProperty(Context.SECURITY_AUTHENTICATION, "simple");
+ }
+
+ try {
+ InitialLdapContext ctx = new InitialLdapContext(env, null);
+ SearchControls searchControls = getSearchControls();
+ String filter = "(&(objectclass=groupOfUniqueNames)(uniqueMember=uid=" + userName
+ + ",ou=People, dc=rhndev, dc=redhat, dc=com))";
+ // Load any search filter
+ String searchFilter = (String) options.get("Filter");
+ // Add the search filter if specified. This only allows for a single search filter.. i.e. foo=bar.
+ if ((searchFilter != null) && (searchFilter.length() != 0)) {
+ filter = "(&(" + loginProperty + "=" + userName + ")" + "(" + searchFilter + "))";
+ } else {
+ filter = "(" + loginProperty + "=" + userName + ")";
+ }
+
+ // Loop through each configured base DN. It may be useful
+ // in the future to allow for a filter to be configured for
+ // each BaseDN, but for now the filter will apply to all.
+ String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
+ for (int x = 0; x < baseDNs.length; x++) {
+ NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ if (!answer.hasMore()) {
+ log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
+
+ // Nothing found for this DN, move to the next one if we have one.
+ continue;
+ }
+
+ // We use the first match
+ SearchResult si = (SearchResult) answer.next();
+
+ }
+
+ } catch (Exception e) {
+ log.info("Failed to validate password: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Load a default set of properties to use when connecting to the LDAP server. If basic authentication is needed,
+ * the caller must set Context.SECURITY_PRINCIPAL, Context.SECURITY_CREDENTIALS and Context.SECURITY_AUTHENTICATION
+ * appropriately.
+ *
+ * @return properties that are to be used when connecting to LDAP server
+ */
+ private Properties getProperties(Properties options) {
+ Properties env = new Properties(options);
+ // Set our default factory name if one is not given
+ String factoryName = env.getProperty(Context.INITIAL_CONTEXT_FACTORY);
+ if (factoryName == null) {
+ env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+ }
+
+ // Setup SSL if requested
+ String protocol = env.getProperty(Context.SECURITY_PROTOCOL);
+ if ((protocol != null) && protocol.equals("ssl")) {
+ String ldapSocketFactory = env.getProperty("java.naming.ldap.factory.socket");
+ if (ldapSocketFactory == null) {
+ env.put("java.naming.ldap.factory.socket", UntrustedSSLSocketFactory.class.getName());
+ }
+ env.put(Context.SECURITY_PROTOCOL, "ssl");
+ }
+
+ // Set the LDAP url
+ String providerUrl = env.getProperty(Context.PROVIDER_URL);
+ if (providerUrl == null) {
+ providerUrl = "ldap://localhost:" + (((protocol != null) && protocol.equals("ssl")) ? "636" : "389");
+ }
+
+ env.setProperty(Context.PROVIDER_URL, providerUrl);
+
+ // Follow referrals automatically
+ env.setProperty(Context.REFERRAL, "follow");
+
+ return env;
+ }
+
+ /**
+ * A simple method to construct a SearchControls object for use when doing LDAP searches. All of the defaults are
+ * used, with the exception of the scope, which is set to SUBTREE rather than the default of ONE_LEVEL
+ *
+ * @return controls what is searched in LDAP
+ */
+ private SearchControls getSearchControls() {
+ // Set the scope to subtree, default is one-level
+ int scope = SearchControls.SUBTREE_SCOPE;
+
+ // No limit on the time waiting for a response
+ int timeLimit = 0;
+
+ // No limit on the number of entries returned
+ long countLimit = 0;
+
+ // Attributes to return.
+ String[] returnedAttributes = null;
+
+ // Don't return the object
+ boolean returnObject = false;
+
+ // No dereferencing during the search
+ boolean deference = false;
+
+ SearchControls constraints = new SearchControls(scope, countLimit, timeLimit, returnedAttributes, returnObject,
+ deference);
+ return constraints;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java
index 7a76b01..2315ee8 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/authz/test/RoleManagerBeanTest.java
@@ -27,6 +27,7 @@ import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
@@ -243,4 +244,28 @@ public class RoleManagerBeanTest extends AbstractEJB3Test {
getTransactionManager().rollback();
}
}
+
+ /**
+ * Test creating, assigning, removing and deleting roles.
+ *
+ * @throws Exception
+ */
+ public void testLdapGroups() throws Exception {
+ getTransactionManager().begin();
+
+ try {
+ Subject superuser = subjectManager.getOverlord();
+ createSession(superuser);
+
+ Role role = new Role("role-manager-role");
+ role.setFsystem(false);
+ role = roleManager.createRole(superuser, role);
+ LdapGroup group = new LdapGroup();
+ group.setName("Foo");
+ role.addLdapGroup(group);
+ assert roleManager.findLdapGroupsByRole(role.getId(), PageControl.getUnlimitedInstance()).size() == 1 : "Ldap Group Foo Should be assigned";
+ } finally {
+ getTransactionManager().rollback();
+ }
+ }
}
\ No newline at end of file
commit 98ea3e7acbf13e94808a796a5478b5195fe59204
Merge: 71e2d92... cbb2b49...
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Mar 4 20:02:34 2010 -0500
Merge branch 'linux-config' into ldap
commit 71e2d920463a909506ffee19dfa73c26f074578a
Merge: 308b9d3... 6445fb2...
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 1 09:49:24 2010 -0500
Merge branch 'linux-config' into ldap
commit 308b9d3b2caa2f344368d713551c12f879448171
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Mar 1 09:48:27 2010 -0500
whateve
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
index 029a2b9..ad8ae65 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
@@ -47,6 +47,7 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
@SuppressWarnings("unchecked")
public Set<Permission> getExplicitGlobalPermissions(Subject subject) {
+ entityManager.flush();
Query query = entityManager.createNamedQuery(Subject.QUERY_GET_GLOBAL_PERMISSIONS);
query.setParameter("subject", subject);
List<Permission> results = query.getResultList();
commit c84a76b89d8c197a3cd3f5dca03ac23e5cf519d5
Merge: 84c5d00... 991b94d...
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Feb 26 11:47:33 2010 -0500
Merge branch 'linux-config' into ldap
commit 84c5d0010c7855544018cdc08e8a0f6c4099703e
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Thu Feb 25 16:12:53 2010 -0500
initial ldap group block
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
index 017e832..1909ec5 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/role/ViewRole.jsp
@@ -173,6 +173,43 @@ groupWidgetProperties = getWidgetProperties('<c:out value="${groupWidgetInstance
</c:if>
</c:if>
+<c:if test="${not Role.fsystem}">
+<c:if test="${useroperations['MANAGE_SECURITY']}">
+
+<html:form method="POST" action="/admin/role/RemoveLdapGroups">
+
+<tiles:insert definition=".header.tab">
+ <tiles:put name="tabKey" value="admin.role.groups.AssignedGroupsTab"/>
+</tiles:insert>
+
+<display:table items="${RoleLdapGrps}" var="group" action="${selfPgAction}"
+ postfix="g"
+ width="100%" cellpadding="0" cellspacing="0">
+
+ <display:column width="1%" property="id" title="<input type=\"checkbox\" onclick=\"ToggleAll(this, groupWidgetProperties, true)\" name=\"listToggleAll\">" isLocalizedTitle="false" styleClass="ListCellCheckbox" headerStyleClass="ListHeaderCheckbox" >
+ <display:checkboxdecorator name="g" onclick="ToggleSelection(this, groupWidgetProperties, true)" styleClass="listMember"/>
+ </display:column>
+
+ <display:column width="25%" property="name" href="/rhq/group/inventory/view.xhtml?category=${group.groupCategory.name}&groupId=${group.id}" title="common.header.Group"
+ sortAttr="r.name"/>
+ <display:column width="75%" property="description" title="common.header.Description"/>
+</display:table>
+
+<tiles:insert definition=".toolbar.addToList">
+ <tiles:put name="addToListUrl" value="/admin/role/RoleAdmin.do?mode=addLdapGroups"/>
+ <tiles:put name="widgetInstanceName" beanName="groupWidgetInstanceName"/>
+ <tiles:put name="addToListParamName" value="r"/>
+ <tiles:put name="addToListParamValue" beanName="Role" beanProperty="id"/>
+ <tiles:put name="pageList" beanName="RoleLdapGrps"/>
+ <tiles:put name="pageAction" beanName="selfPgAction"/>
+ <tiles:put name="postfix" value="g"/>
+</tiles:insert>
+
+<html:hidden property="r"/>
+</html:form>
+</c:if>
+</c:if>
+
<tiles:insert definition=".page.return">
<tiles:put name="returnUrl" value="/admin/role/RoleAdmin.do?mode=list"/>
<tiles:put name="returnKey" value="admin.role.view.ReturnToRoles"/>
commit 3e1622402c2fa5724f505065c5b89512fa7da664
Merge: 59a906f... a986379...
Author: Partha Aji <paji(a)redhat.com>
Date: Thu Feb 25 10:19:20 2010 -0500
Merge branch 'linux-config' into ldap
commit 59a906f82c207c0128ad5be30dfc4c112775dbf9
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 19:41:44 2010 -0500
Removed the unused is_ldap column from RHQ_SUBJECT_ROLE_MAP since we are using RHQ_SUBJECT_ROLE_LDAP_MAP for that information
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index 1eaa6f8..6e0a31e 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -72,7 +72,6 @@
<table name="RHQ_SUBJECT_ROLE_MAP">
<column name="SUBJECT_ID" required="true" type="INTEGER" references="RHQ_SUBJECT"/>
<column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
- <column name="IS_LDAP" required="true" type="BOOLEAN" default="false"/>
<constraint name="RHQ_SUBJECT_ROLE_MAPPING_KEY">
<primaryKey>
commit b9287ab8a2ff37eed95fc7883504db0a7130c7c1
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 19:32:04 2010 -0500
Mapping For Solution 2 Done
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index c7d895b..9b991cd 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -40,7 +40,6 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.QueryHint;
import javax.persistence.SequenceGenerator;
@@ -228,18 +227,19 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @OneToMany(mappedBy = "subject")
- private Set<SubjectRoleEntity> subjectRoles;
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
+ @ManyToMany
+ private java.util.Set<Role> roles;
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_LDAP_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
@ManyToMany
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
- private Set<Role> roles = new HashSet<Role>();
+ private java.util.Set<Role> ldapRoles;
@Transient
private Integer sessionId = null;
private void init() {
- subjectRoles = new HashSet<SubjectRoleEntity>();
+ roles = new HashSet<Role>();
}
/**
@@ -364,51 +364,44 @@ public class Subject implements Externalizable {
this.configuration = configuration;
}
- public Set<SubjectRoleEntity> getSubjectRoles() {
- if (subjectRoles == null) {
- subjectRoles = new HashSet<SubjectRoleEntity>();
+ public java.util.Set<Role> getRoles() {
+ if (this.roles == null) {
+ this.roles = new HashSet<Role>();
}
- return subjectRoles;
- }
-
- public void setSubjectRoles(Set<SubjectRoleEntity> subjectRolesIn) {
- subjectRoles = subjectRolesIn;
- }
- public Set<Role> getRoles() {
- if (roles == null) {
- roles = new HashSet<Role>();
- }
- return roles;
+ return this.roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
- public void addRole(Role role, boolean ldap) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setSubject(this);
- s.setRole(role);
- s.setLdap(ldap);
- getSubjectRoles().add(s);
- }
-
public void addRole(Role role) {
- addRole(role, false);
+ getRoles().add(role);
}
public void removeRole(Role role) {
- SubjectRoleEntity toRemove = null;
- for (SubjectRoleEntity s : getSubjectRoles()) {
- if (s.getSubject().equals(this) && s.getRole().equals(role)) {
- toRemove = s;
- break;
- }
- }
- if (toRemove != null) {
- getSubjectRoles().remove(toRemove);
+ getRoles().remove(role);
+ }
+
+ public java.util.Set<Role> getLdapRoles() {
+ if (this.ldapRoles == null) {
+ this.ldapRoles = new HashSet<Role>();
}
+
+ return this.ldapRoles;
+ }
+
+ public void setLdapRoles(Set<Role> roles) {
+ this.ldapRoles = roles;
+ }
+
+ public void addLdapRole(Role role) {
+ getLdapRoles().add(role);
+ }
+
+ public void removeLdapRole(Role role) {
+ getLdapRoles().remove(role);
}
@Override
@@ -517,7 +510,7 @@ public class Subject implements Externalizable {
this.factive = in.readBoolean();
this.fsystem = in.readBoolean();
this.configuration = (Configuration) in.readObject();
- setRoles((Set<Role>) in.readObject());
+ this.roles = (Set<Role>) in.readObject();
this.sessionId = in.readInt();
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
deleted file mode 100644
index 3636fb5..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.rhq.core.domain.auth;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.Table;
-
-import org.rhq.core.domain.authz.Role;
-
-@Entity
-(a)IdClass(SubjectRolePK.class)
-@Table(name = "RHQ_SUBJECT_ROLE_MAP")
-public class SubjectRoleEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Id
- private Subject subject;
-
- @Id
- private Role role;
-
- @Column(name = "IS_LDAP")
- private boolean isLdap;
-
- public Subject getSubject() {
- return subject;
- }
-
- public void setSubject(Subject subject) {
- this.subject = subject;
- }
-
- public Role getRole() {
- return role;
- }
-
- public void setRole(Role role) {
- this.role = role;
- }
-
- public boolean isLdap() {
- return isLdap;
- }
-
- public void setLdap(boolean isLdap) {
- this.isLdap = isLdap;
- }
-
- @Override
- public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- result = (PRIME * result) + ((subject == null) ? 0 : subject.hashCode());
- result = (PRIME * result) + ((role == null) ? 0 : role.hashCode());
- result = (PRIME * result) + ((isLdap) ? 0 : PRIME);
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
-
- if ((obj == null) || !(obj instanceof SubjectRoleEntity)) {
- return false;
- }
-
- final SubjectRoleEntity other = (SubjectRoleEntity) obj;
- if (subject == null) {
- if (other.subject != null) {
- return false;
- }
- } else if (!subject.equals(other.subject)) {
- return false;
- }
-
- if (role == null) {
- if (other.role != null) {
- return false;
- }
- } else if (!role.equals(other.role)) {
- return false;
- }
-
- return isLdap == other.isLdap;
- }
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
deleted file mode 100644
index 8b6259c..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.core.domain.auth;
-
-import java.io.Serializable;
-
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.rhq.core.domain.authz.Role;
-
-/**
- * @author paji
- *
- */
-public class SubjectRolePK implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @ManyToOne
- @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
- private Subject subject;
-
- @ManyToOne
- @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
- private Role role;
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 5267fca..b7004bd 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -37,7 +37,6 @@ import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@@ -47,7 +46,6 @@ import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.auth.SubjectRoleEntity;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
@@ -106,11 +104,11 @@ public class Role implements Serializable {
@Column(name = "FSYSTEM")
private Boolean fsystem;
- @OneToMany(mappedBy = "role")
- private java.util.Set<SubjectRoleEntity> roleSubjects;
-
@ManyToMany(mappedBy = "roles")
- private Set<Subject> subjects = new HashSet<Subject>();
+ private java.util.Set<Subject> subjects = new HashSet<Subject>();
+
+ @ManyToMany(mappedBy = "ldapRoles")
+ private java.util.Set<Subject> ldapSubjects = new HashSet<Subject>();
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@@ -183,52 +181,56 @@ public class Role implements Serializable {
return this.permissions.remove(permission);
}
- public Set<SubjectRoleEntity> getRoleSubjects() {
- if (roleSubjects == null) {
- roleSubjects = new HashSet<SubjectRoleEntity>();
- }
- return roleSubjects;
+ public java.util.Set<Subject> getSubjects() {
+ return subjects;
}
- public void setRoleSubjects(Set<SubjectRoleEntity> subjectsIn) {
- roleSubjects = subjectsIn;
+ public void setSubjects(Set<Subject> subjects) {
+ this.subjects = subjects;
}
- public java.util.Set<Subject> getSubjects() {
- if (subjects == null) {
- subjects = new HashSet<Subject>();
+ public void addSubject(Subject subject) {
+ if (this.subjects == null) {
+ this.subjects = new HashSet<Subject>();
}
- return subjects;
+
+ subject.addRole(this);
+ this.subjects.add(subject);
}
- public void setSubjects(Set<Subject> subjects) {
- this.subjects = subjects;
+ public void removeSubject(Subject subject) {
+ if (this.subjects == null) {
+ this.subjects = new HashSet<Subject>();
+ }
+
+ subject.removeRole(this);
+ this.subjects.remove(subject);
}
- public void addSubject(Subject subject, boolean ldap) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setSubject(subject);
- s.setRole(this);
- s.setLdap(ldap);
- getRoleSubjects().add(s);
+ public java.util.Set<Subject> getLdapSubjects() {
+ return ldapSubjects;
}
- public void addSubject(Subject subject) {
- addSubject(subject, false);
+ public void setLdapSubjects(Set<Subject> subjects) {
+ this.ldapSubjects = subjects;
}
- public void removeSubject(Subject subject) {
- SubjectRoleEntity toRemove = null;
- for (SubjectRoleEntity s : getRoleSubjects()) {
- if (s.getSubject().equals(subject) && s.getRole().equals(this)) {
- toRemove = s;
- break;
- }
+ public void addLdapSubject(Subject subject) {
+ if (this.ldapSubjects == null) {
+ this.ldapSubjects = new HashSet<Subject>();
}
- if (toRemove != null) {
- getRoleSubjects().remove(toRemove);
- subject.removeRole(this);
+
+ subject.addLdapRole(this);
+ this.ldapSubjects.add(subject);
+ }
+
+ public void removeLdapSubject(Subject subject) {
+ if (this.ldapSubjects == null) {
+ this.ldapSubjects = new HashSet<Subject>();
}
+
+ subject.removeLdapRole(this);
+ this.ldapSubjects.remove(subject);
}
public Set<org.rhq.core.domain.resource.group.ResourceGroup> getResourceGroups() {
commit 8d87c981864acc5720869f0f651c9890f8653b0b
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 19:05:22 2010 -0500
Initial commit for solution 2
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index dcb993b..1eaa6f8 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -82,4 +82,14 @@
</constraint>
</table>
+ <table name="RHQ_SUBJECT_ROLE_LDAP_MAP">
+ <column name="SUBJECT_ID" required="true" type="INTEGER" references="RHQ_SUBJECT"/>
+ <column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
+ <constraint name="RHQ_SUBJECT_ROLE_LDAP_MAPPING_KEY">
+ <primaryKey>
+ <field ref="SUBJECT_ID"/>
+ <field ref="ROLE_ID"/>
+ </primaryKey>
+ </constraint>
+ </table>
</dbsetup>
commit 04fad7aae80087e6c5a0e9981d1115159873af8f
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 16:06:01 2010 -0500
Added back the Many To Many roles magic to preserve roles variable
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 73d074a..c7d895b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -36,6 +36,8 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@@ -229,6 +231,10 @@ public class Subject implements Externalizable {
@OneToMany(mappedBy = "subject")
private Set<SubjectRoleEntity> subjectRoles;
+ @ManyToMany
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
+ private Set<Role> roles = new HashSet<Role>();
+
@Transient
private Integer sessionId = null;
@@ -370,22 +376,14 @@ public class Subject implements Externalizable {
}
public Set<Role> getRoles() {
- Set<Role> r = new HashSet<Role>();
- for (SubjectRoleEntity s : getSubjectRoles()) {
- r.add(s.getRole());
+ if (roles == null) {
+ roles = new HashSet<Role>();
}
- return r;
+ return roles;
}
public void setRoles(Set<Role> roles) {
- Set<SubjectRoleEntity> sroles = getSubjectRoles();
- sroles.clear();
- for (Role r : roles) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setSubject(this);
- s.setRole(r);
- sroles.add(s);
- }
+ this.roles = roles;
}
public void addRole(Role role, boolean ldap) {
@@ -501,7 +499,7 @@ public class Subject implements Externalizable {
out.writeBoolean(factive);
out.writeBoolean(fsystem);
out.writeObject(configuration);
- out.writeObject(getRoles());
+ out.writeObject(roles);
// not supplied by remote: subjectNotifications
out.writeInt(this.sessionId == null ? 0 : this.sessionId);
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index d549027..5267fca 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -110,6 +110,9 @@ public class Role implements Serializable {
private java.util.Set<SubjectRoleEntity> roleSubjects;
@ManyToMany(mappedBy = "roles")
+ private Set<Subject> subjects = new HashSet<Subject>();
+
+ @ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@Cascade( { CascadeType.ALL })
@@ -192,22 +195,14 @@ public class Role implements Serializable {
}
public java.util.Set<Subject> getSubjects() {
- Set<Subject> s = new HashSet<Subject>();
- for (SubjectRoleEntity sre : getRoleSubjects()) {
- s.add(sre.getSubject());
+ if (subjects == null) {
+ subjects = new HashSet<Subject>();
}
- return s;
+ return subjects;
}
public void setSubjects(Set<Subject> subjects) {
- Set<SubjectRoleEntity> sroles = getRoleSubjects();
- sroles.clear();
- for (Subject subject : subjects) {
- SubjectRoleEntity s = new SubjectRoleEntity();
- s.setRole(this);
- s.setSubject(subject);
- sroles.add(s);
- }
+ this.subjects = subjects;
}
public void addSubject(Subject subject, boolean ldap) {
commit 09f0af7201c726cd1806d232164d2ea40c1470d2
Author: Shannon Hughes <shughes(a)scooby.rdu.redhat.com>
Date: Wed Feb 24 14:16:54 2010 -0500
added ldap group member txt field for ldap configs
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
index 6e95ef7..4f35fe6 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
@@ -61,6 +61,7 @@ public class SystemConfigForm extends BaseValidatorForm {
private String ldapSearchBase = "";
private String ldapSearchFilter = "";
private String ldapGroupFilter = "";
+ private String ldapGroupMember = "";
private String ldapUsername = "";
private String ldapPassword = "";
private Boolean ldapEnabled = null;
@@ -85,6 +86,7 @@ public class SystemConfigForm extends BaseValidatorForm {
buf.append(" ldapUsername=").append(ldapUsername);
buf.append(" ldapPassword=").append(ldapPassword);
buf.append(" ldapGroupFilter=").append(ldapGroupFilter);
+ buf.append(" ldapGroupMember=").append(ldapGroupMember);
return buf.toString();
}
@@ -128,6 +130,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapUsername = "";
ldapPassword = "";
ldapGroupFilter = "";
+ ldapGroupMember = "";
super.reset(mapping, request);
}
@@ -217,6 +220,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapSearchBase = prop.getProperty(RHQConstants.LDAPBaseDN);
ldapSearchFilter = prop.getProperty(RHQConstants.LDAPFilter);
ldapGroupFilter = prop.getProperty(RHQConstants.LDAPGroupFilter);
+ ldapGroupMember = prop.getProperty(RHQConstants.LDAPGroupMember);
ldapUsername = prop.getProperty(RHQConstants.LDAPBindDN);
ldapPassword = prop.getProperty(RHQConstants.LDAPBindPW);
@@ -317,6 +321,7 @@ public class SystemConfigForm extends BaseValidatorForm {
prop.setProperty(RHQConstants.LDAPBaseDN, ldapSearchBase);
prop.setProperty(RHQConstants.LDAPFilter, ldapSearchFilter);
prop.setProperty(RHQConstants.LDAPGroupFilter, ldapGroupFilter);
+ prop.setProperty(RHQConstants.LDAPGroupMember, ldapGroupMember);
prop.setProperty(RHQConstants.LDAPBindDN, ldapUsername);
prop.setProperty(RHQConstants.LDAPBindPW, ldapPassword);
prop.setProperty(RHQConstants.LDAPProtocol, ldapSsl ? "ssl" : "");
@@ -572,6 +577,14 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapGroupFilter = s;
}
+ public String getLdapGroupMember() {
+ return ldapGroupFilter;
+ }
+
+ public void setLdapGroupMember(String s) {
+ ldapGroupMember = s;
+ }
+
public String getLdapUsername() {
return ldapUsername;
}
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 c65317a..e95869f 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
@@ -631,6 +631,7 @@ admin.settings.LDAPHostNameLabel=LDAP Host Name:
admin.settings.LDAPUsernameLabel=Username:
admin.settings.LDAPSearchFilterLabel=Search Filter:
admin.settings.LDAPGroupSearchLabel=Group Search Filter:
+admin.settings.LDAPGroupMemberLabel=Group Member Filter:
admin.settings.LDAPPortLabel=LDAP Port:
admin.settings.LDAPUrlLabel=URL:
admin.settings.LDAPSslLabel=SSL:
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
index fbf6955..17f0a20 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
@@ -33,27 +33,34 @@
<tr>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPUrlLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapUrl"/></td>
- <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSslLabel"/></td>
- <td width="30%" class="BlockContent"><html:checkbox property="ldapSsl"/></td>
- </tr>
- <tr>
- <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPUsernameLabel"/></td>
- <td width="30%" class="BlockContent"><html:text size="31" property="ldapUsername"/></td>
- <td width="20%" class="BlockLabel"><fmt:message key="common.label.Password"/></td>
- <td width="30%" class="BlockContent"><html:password size="31" property="ldapPassword" redisplay="true"/></td>
- </tr>
- <tr>
- <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSearchBaseLabel"/></td>
- <td width="30%" class="BlockContent"><html:text size="31" property="ldapSearchBase"/></td>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSearchFilterLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapSearchFilter"/></td>
</tr>
<tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSearchBaseLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapSearchBase"/></td>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPLoginPropertyLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapLoginProperty"/></td>
+ </tr>
+ <tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPUsernameLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapUsername"/></td>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPGroupSearchLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapGroupFilter"/></td>
</tr>
+ <tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="common.label.Password"/></td>
+ <td width="30%" class="BlockContent"><html:password size="31" property="ldapPassword" redisplay="true"/></td>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPGroupMemberLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapGroupMember"/></td>
+ </tr>
+ <tr>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPSslLabel"/></td>
+ <td width="30%" class="BlockContent"><html:checkbox property="ldapSsl"/></td>
+ <td width="20%" class="BlockLabel"> </td>
+ <td width="30%" class="BlockContent"> </td>
+ </tr>
+
<tr>
<td colspan="4" class="BlockBottomLine"><html:img page="/images/spacer.gif" width="1" height="1" border="0"/></td>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
index 8a94231..7bb1d72 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
@@ -47,6 +47,7 @@ public class RHQConstants {
public static final String LDAPLoginProperty = "CAM_LDAP_LOGIN_PROPERTY";
public static final String LDAPFilter = "CAM_LDAP_FILTER";
public static final String LDAPGroupFilter = "CAM_LDAP_GROUP_FILTER";
+ public static final String LDAPGroupMember = "CAM_LDAP_GROUP_MEMBER";
public static final String LDAPBaseDN = "CAM_LDAP_BASE_DN";
public static final String LDAPBindDN = "CAM_LDAP_BIND_DN";
public static final String LDAPBindPW = "CAM_LDAP_BIND_PW";
commit 9e4ca33363b357405733065e27f98e66d46535c1
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 12:51:22 2010 -0500
More updates on the Mapping
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 191106e..73d074a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -226,7 +226,7 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @OneToMany(mappedBy = "user")
+ @OneToMany(mappedBy = "subject")
private Set<SubjectRoleEntity> subjectRoles;
@Transient
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
index ea110f7..3636fb5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -37,6 +37,11 @@ import org.rhq.core.domain.authz.Role;
@Table(name = "RHQ_SUBJECT_ROLE_MAP")
public class SubjectRoleEntity implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
@Id
private Subject subject;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
index e881b5b..8b6259c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
@@ -19,6 +19,8 @@
package org.rhq.core.domain.auth;
+import java.io.Serializable;
+
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@@ -28,7 +30,12 @@ import org.rhq.core.domain.authz.Role;
* @author paji
*
*/
-public class SubjectRolePK {
+public class SubjectRolePK implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
@ManyToOne
@JoinColumn(name = "USER_ID", referencedColumnName = "ID")
private Subject subject;
commit c5ad7ab61a62cc4ad847a7ea43e30d9dbcf81c48
Merge: 17a885c... 073abeb...
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 11:32:03 2010 -0500
Merge branch 'linux-config' into ldap
commit 17a885cd48cf2fed8723b6253154fe2173d4cd58
Author: Partha Aji <paji(a)redhat.com>
Date: Wed Feb 24 11:30:56 2010 -0500
Added a more accurate mapping for SubjectRoleEntity
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 023faa3..191106e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -36,7 +36,6 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@@ -227,8 +226,7 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @OneToMany
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
+ @OneToMany(mappedBy = "user")
private Set<SubjectRoleEntity> subjectRoles;
@Transient
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
index fc0b0ed..ea110f7 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -25,20 +25,22 @@ package org.rhq.core.domain.auth;
import java.io.Serializable;
import javax.persistence.Column;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
import javax.persistence.Table;
import org.rhq.core.domain.authz.Role;
+@Entity
+(a)IdClass(SubjectRolePK.class)
@Table(name = "RHQ_SUBJECT_ROLE_MAP")
public class SubjectRoleEntity implements Serializable {
- @ManyToOne
- @JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID")
+
+ @Id
private Subject subject;
- @ManyToOne
- @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
+ @Id
private Role role;
@Column(name = "IS_LDAP")
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
new file mode 100644
index 0000000..e881b5b
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRolePK.java
@@ -0,0 +1,39 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.auth;
+
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.rhq.core.domain.authz.Role;
+
+/**
+ * @author paji
+ *
+ */
+public class SubjectRolePK {
+ @ManyToOne
+ @JoinColumn(name = "USER_ID", referencedColumnName = "ID")
+ private Subject subject;
+
+ @ManyToOne
+ @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
+ private Role role;
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 1e66029..d549027 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -106,8 +106,7 @@ public class Role implements Serializable {
@Column(name = "FSYSTEM")
private Boolean fsystem;
- @OneToMany
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "ROLE_ID") })
+ @OneToMany(mappedBy = "role")
private java.util.Set<SubjectRoleEntity> roleSubjects;
@ManyToMany(mappedBy = "roles")
commit 7789e66b5e5a114e67e2d0bb2bedc3641a33abc0
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 13:21:49 2010 -0500
Updated the addSubject/removeSubject stuff from Role to use SubjectRoleEntity bean
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 121f555..023faa3 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -231,13 +231,11 @@ public class Subject implements Externalizable {
@JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
private Set<SubjectRoleEntity> subjectRoles;
- private Set<Role> roles;
-
@Transient
private Integer sessionId = null;
private void init() {
- roles = new HashSet<Role>();
+ subjectRoles = new HashSet<SubjectRoleEntity>();
}
/**
@@ -505,7 +503,7 @@ public class Subject implements Externalizable {
out.writeBoolean(factive);
out.writeBoolean(fsystem);
out.writeObject(configuration);
- out.writeObject(roles);
+ out.writeObject(getRoles());
// not supplied by remote: subjectNotifications
out.writeInt(this.sessionId == null ? 0 : this.sessionId);
}
@@ -523,7 +521,7 @@ public class Subject implements Externalizable {
this.factive = in.readBoolean();
this.fsystem = in.readBoolean();
this.configuration = (Configuration) in.readObject();
- this.roles = (Set<Role>) in.readObject();
+ setRoles((Set<Role>) in.readObject());
this.sessionId = in.readInt();
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 4e157c6..1e66029 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -110,8 +110,6 @@ public class Role implements Serializable {
@JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "ROLE_ID") })
private java.util.Set<SubjectRoleEntity> roleSubjects;
- private java.util.Set<Subject> subjects = new HashSet<Subject>();
-
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
@@ -183,30 +181,60 @@ public class Role implements Serializable {
return this.permissions.remove(permission);
}
+ public Set<SubjectRoleEntity> getRoleSubjects() {
+ if (roleSubjects == null) {
+ roleSubjects = new HashSet<SubjectRoleEntity>();
+ }
+ return roleSubjects;
+ }
+
+ public void setRoleSubjects(Set<SubjectRoleEntity> subjectsIn) {
+ roleSubjects = subjectsIn;
+ }
+
public java.util.Set<Subject> getSubjects() {
- return subjects;
+ Set<Subject> s = new HashSet<Subject>();
+ for (SubjectRoleEntity sre : getRoleSubjects()) {
+ s.add(sre.getSubject());
+ }
+ return s;
}
public void setSubjects(Set<Subject> subjects) {
- this.subjects = subjects;
+ Set<SubjectRoleEntity> sroles = getRoleSubjects();
+ sroles.clear();
+ for (Subject subject : subjects) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setRole(this);
+ s.setSubject(subject);
+ sroles.add(s);
+ }
}
- public void addSubject(Subject subject) {
- if (this.subjects == null) {
- this.subjects = new HashSet<Subject>();
- }
+ public void addSubject(Subject subject, boolean ldap) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setSubject(subject);
+ s.setRole(this);
+ s.setLdap(ldap);
+ getRoleSubjects().add(s);
+ }
- subject.addRole(this);
- this.subjects.add(subject);
+ public void addSubject(Subject subject) {
+ addSubject(subject, false);
}
public void removeSubject(Subject subject) {
- if (this.subjects == null) {
- this.subjects = new HashSet<Subject>();
+ SubjectRoleEntity toRemove = null;
+ for (SubjectRoleEntity s : getRoleSubjects()) {
+ if (s.getSubject().equals(subject) && s.getRole().equals(this)) {
+ toRemove = s;
+ break;
+ }
+ }
+ if (toRemove != null) {
+ getRoleSubjects().remove(toRemove);
+ subject.removeRole(this);
}
-
- subject.removeRole(this);
- this.subjects.remove(subject);
}
public Set<org.rhq.core.domain.resource.group.ResourceGroup> getResourceGroups() {
commit dcb59bb828983e2879cac829852437e00e0f29d8
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 11:03:16 2010 -0500
More clean up work on Subjects and SubjectRoleEntity
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index f7f6ac2..121f555 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -229,9 +229,9 @@ public class Subject implements Externalizable {
@OneToMany
@JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
- private java.util.Set<SubjectRoleEntity> subjectRoles;
+ private Set<SubjectRoleEntity> subjectRoles;
- private java.util.Set<Role> roles;
+ private Set<Role> roles;
@Transient
private Integer sessionId = null;
@@ -362,14 +362,18 @@ public class Subject implements Externalizable {
this.configuration = configuration;
}
- public java.util.Set<SubjectRoleEntity> getSubjectRoles() {
+ public Set<SubjectRoleEntity> getSubjectRoles() {
if (subjectRoles == null) {
subjectRoles = new HashSet<SubjectRoleEntity>();
}
return subjectRoles;
}
- public java.util.Set<Role> getRoles() {
+ public void setSubjectRoles(Set<SubjectRoleEntity> subjectRolesIn) {
+ subjectRoles = subjectRolesIn;
+ }
+
+ public Set<Role> getRoles() {
Set<Role> r = new HashSet<Role>();
for (SubjectRoleEntity s : getSubjectRoles()) {
r.add(s.getRole());
@@ -378,15 +382,39 @@ public class Subject implements Externalizable {
}
public void setRoles(Set<Role> roles) {
- this.roles = roles;
+ Set<SubjectRoleEntity> sroles = getSubjectRoles();
+ sroles.clear();
+ for (Role r : roles) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setSubject(this);
+ s.setRole(r);
+ sroles.add(s);
+ }
+ }
+
+ public void addRole(Role role, boolean ldap) {
+ SubjectRoleEntity s = new SubjectRoleEntity();
+ s.setSubject(this);
+ s.setRole(role);
+ s.setLdap(ldap);
+ getSubjectRoles().add(s);
}
public void addRole(Role role) {
- getRoles().add(role);
+ addRole(role, false);
}
public void removeRole(Role role) {
- getRoles().remove(role);
+ SubjectRoleEntity toRemove = null;
+ for (SubjectRoleEntity s : getSubjectRoles()) {
+ if (s.getSubject().equals(this) && s.getRole().equals(role)) {
+ toRemove = s;
+ break;
+ }
+ }
+ if (toRemove != null) {
+ getSubjectRoles().remove(toRemove);
+ }
}
@Override
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
index 369b491..fc0b0ed 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -1,3 +1,25 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.core.domain.auth;
import java.io.Serializable;
@@ -11,7 +33,6 @@ import org.rhq.core.domain.authz.Role;
@Table(name = "RHQ_SUBJECT_ROLE_MAP")
public class SubjectRoleEntity implements Serializable {
-
@ManyToOne
@JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID")
private Subject subject;
@@ -47,4 +68,43 @@ public class SubjectRoleEntity implements Serializable {
this.isLdap = isLdap;
}
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = (PRIME * result) + ((subject == null) ? 0 : subject.hashCode());
+ result = (PRIME * result) + ((role == null) ? 0 : role.hashCode());
+ result = (PRIME * result) + ((isLdap) ? 0 : PRIME);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if ((obj == null) || !(obj instanceof SubjectRoleEntity)) {
+ return false;
+ }
+
+ final SubjectRoleEntity other = (SubjectRoleEntity) obj;
+ if (subject == null) {
+ if (other.subject != null) {
+ return false;
+ }
+ } else if (!subject.equals(other.subject)) {
+ return false;
+ }
+
+ if (role == null) {
+ if (other.role != null) {
+ return false;
+ }
+ } else if (!role.equals(other.role)) {
+ return false;
+ }
+
+ return isLdap == other.isLdap;
+ }
}
commit 2e83a0cc092f8feef995642502447389152d598e
Merge: 3f91c1c... 4c82f06...
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 10:20:31 2010 -0500
Merge branch 'linux-config' into ldap
commit 3f91c1ca64b04ae174d42ca3839fa1cdaa99dbbc
Author: Partha Aji <paji(a)redhat.com>
Date: Tue Feb 23 10:09:47 2010 -0500
Adding initial mapping change needed for ldap
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index f13d6ef..f7f6ac2 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -37,7 +37,6 @@ import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@@ -161,8 +160,7 @@ import org.rhq.core.domain.util.serial.ExternalizableStrategy;
+ " AND s.fsystem = FALSE " //
+ " AND s.factive = TRUE"), //
@NamedQuery(name = Subject.QUERY_DYNAMIC_CONFIG_VALUES, query = "" //
- + "SELECT s.name, s.name FROM Subject AS s WHERE s.fsystem = false")
-})
+ + "SELECT s.name, s.name FROM Subject AS s WHERE s.fsystem = false") })
@SequenceGenerator(name = "RHQ_SUBJECT_ID_SEQ", sequenceName = "RHQ_SUBJECT_ID_SEQ")
@Table(name = "RHQ_SUBJECT")
/*@Cache(usage= CacheConcurrencyStrategy.TRANSACTIONAL)*/
@@ -229,8 +227,10 @@ public class Subject implements Externalizable {
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE })
private Configuration configuration;
- @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
- @ManyToMany
+ @OneToMany
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "SUBJECT_ID") })
+ private java.util.Set<SubjectRoleEntity> subjectRoles;
+
private java.util.Set<Role> roles;
@Transient
@@ -362,12 +362,19 @@ public class Subject implements Externalizable {
this.configuration = configuration;
}
- public java.util.Set<Role> getRoles() {
- if (this.roles == null) {
- this.roles = new HashSet<Role>();
+ public java.util.Set<SubjectRoleEntity> getSubjectRoles() {
+ if (subjectRoles == null) {
+ subjectRoles = new HashSet<SubjectRoleEntity>();
}
+ return subjectRoles;
+ }
- return this.roles;
+ public java.util.Set<Role> getRoles() {
+ Set<Role> r = new HashSet<Role>();
+ for (SubjectRoleEntity s : getSubjectRoles()) {
+ r.add(s.getRole());
+ }
+ return r;
}
public void setRoles(Set<Role> roles) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
new file mode 100644
index 0000000..369b491
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/SubjectRoleEntity.java
@@ -0,0 +1,50 @@
+package org.rhq.core.domain.auth;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.rhq.core.domain.authz.Role;
+
+@Table(name = "RHQ_SUBJECT_ROLE_MAP")
+public class SubjectRoleEntity implements Serializable {
+
+ @ManyToOne
+ @JoinColumn(name = "SUBJECT_ID", referencedColumnName = "ID")
+ private Subject subject;
+
+ @ManyToOne
+ @JoinColumn(name = "ROLE_ID", referencedColumnName = "ID")
+ private Role role;
+
+ @Column(name = "IS_LDAP")
+ private boolean isLdap;
+
+ public Subject getSubject() {
+ return subject;
+ }
+
+ public void setSubject(Subject subject) {
+ this.subject = subject;
+ }
+
+ public Role getRole() {
+ return role;
+ }
+
+ public void setRole(Role role) {
+ this.role = role;
+ }
+
+ public boolean isLdap() {
+ return isLdap;
+ }
+
+ public void setLdap(boolean isLdap) {
+ this.isLdap = isLdap;
+ }
+
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 35772bd..4e157c6 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -47,6 +47,7 @@ import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.auth.SubjectRoleEntity;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
@@ -78,8 +79,7 @@ import org.rhq.core.domain.auth.Subject;
+ " JOIN ss.roles AS rr " //
+ " WHERE ss.id = :subjectId )"), //
@NamedQuery(name = Role.QUERY_DYNAMIC_CONFIG_VALUES, query = "" //
- + "SELECT r.name, r.name FROM Role AS r")
-})
+ + "SELECT r.name, r.name FROM Role AS r") })
@SequenceGenerator(name = "RHQ_ROLE_ID_SEQ", sequenceName = "RHQ_ROLE_ID_SEQ")
@Table(name = "RHQ_ROLE")
public class Role implements Serializable {
@@ -106,7 +106,10 @@ public class Role implements Serializable {
@Column(name = "FSYSTEM")
private Boolean fsystem;
- @ManyToMany(mappedBy = "roles")
+ @OneToMany
+ @JoinTable(name = "RHQ_SUBJECT_ROLE_MAP", joinColumns = { @JoinColumn(name = "ROLE_ID") })
+ private java.util.Set<SubjectRoleEntity> roleSubjects;
+
private java.util.Set<Subject> subjects = new HashSet<Subject>();
@ManyToMany(mappedBy = "roles")
commit 204c6b7de81df429eae5a506c36a84f0ddb7bdc2
Merge: e09efb0... 2ae22a1...
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Feb 22 13:06:45 2010 -0500
Merge branch 'linux-config' into ldap
commit e09efb07b5c91f0a7889d2a6bb58ba41c1ac25c6
Author: Partha Aji <paji(a)redhat.com>
Date: Mon Feb 22 12:59:31 2010 -0500
Intial config setup for LDAP stuff..
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
index c636aa2..6e95ef7 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/admin/config/SystemConfigForm.java
@@ -60,6 +60,7 @@ public class SystemConfigForm extends BaseValidatorForm {
private String ldapLoginProperty = "";
private String ldapSearchBase = "";
private String ldapSearchFilter = "";
+ private String ldapGroupFilter = "";
private String ldapUsername = "";
private String ldapPassword = "";
private Boolean ldapEnabled = null;
@@ -83,6 +84,7 @@ public class SystemConfigForm extends BaseValidatorForm {
buf.append(" ldapSearchFilter=").append(ldapSearchFilter);
buf.append(" ldapUsername=").append(ldapUsername);
buf.append(" ldapPassword=").append(ldapPassword);
+ buf.append(" ldapGroupFilter=").append(ldapGroupFilter);
return buf.toString();
}
@@ -125,6 +127,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapSearchFilter = "";
ldapUsername = "";
ldapPassword = "";
+ ldapGroupFilter = "";
super.reset(mapping, request);
}
@@ -213,6 +216,7 @@ public class SystemConfigForm extends BaseValidatorForm {
ldapLoginProperty = prop.getProperty(RHQConstants.LDAPLoginProperty);
ldapSearchBase = prop.getProperty(RHQConstants.LDAPBaseDN);
ldapSearchFilter = prop.getProperty(RHQConstants.LDAPFilter);
+ ldapGroupFilter = prop.getProperty(RHQConstants.LDAPGroupFilter);
ldapUsername = prop.getProperty(RHQConstants.LDAPBindDN);
ldapPassword = prop.getProperty(RHQConstants.LDAPBindPW);
@@ -312,6 +316,7 @@ public class SystemConfigForm extends BaseValidatorForm {
prop.setProperty(RHQConstants.LDAPLoginProperty, ldapLoginProperty);
prop.setProperty(RHQConstants.LDAPBaseDN, ldapSearchBase);
prop.setProperty(RHQConstants.LDAPFilter, ldapSearchFilter);
+ prop.setProperty(RHQConstants.LDAPGroupFilter, ldapGroupFilter);
prop.setProperty(RHQConstants.LDAPBindDN, ldapUsername);
prop.setProperty(RHQConstants.LDAPBindPW, ldapPassword);
prop.setProperty(RHQConstants.LDAPProtocol, ldapSsl ? "ssl" : "");
@@ -558,6 +563,14 @@ public class SystemConfigForm extends BaseValidatorForm {
public void setLdapSearchFilter(String s) {
ldapSearchFilter = s;
}
+
+ public String getLdapGroupFilter() {
+ return ldapGroupFilter;
+ }
+
+ public void setLdapGroupFilter(String s) {
+ ldapGroupFilter = s;
+ }
public String getLdapUsername() {
return ldapUsername;
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 571cf22..1565fe3 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
@@ -630,6 +630,7 @@ admin.settings.LDAPConfigPropTab=LDAP Configuration Properties
admin.settings.LDAPHostNameLabel=LDAP Host Name:
admin.settings.LDAPUsernameLabel=Username:
admin.settings.LDAPSearchFilterLabel=Search Filter:
+admin.settings.LDAPGroupSearchLabel=Group Search Filter:
admin.settings.LDAPPortLabel=LDAP Port:
admin.settings.LDAPUrlLabel=URL:
admin.settings.LDAPSslLabel=SSL:
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
index a0ea5ff..fbf6955 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/config/LDAPForm.jsp
@@ -51,8 +51,8 @@
<tr>
<td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPLoginPropertyLabel"/></td>
<td width="30%" class="BlockContent"><html:text size="31" property="ldapLoginProperty"/></td>
- <td width="20%" class="BlockLabel"> </td>
- <td width="30%" class="BlockContent"> </td>
+ <td width="20%" class="BlockLabel"><fmt:message key="admin.settings.LDAPGroupSearchLabel"/></td>
+ <td width="30%" class="BlockContent"><html:text size="31" property="ldapGroupFilter"/></td>
</tr>
<tr>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
index 5411acc..8a94231 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
@@ -46,6 +46,7 @@ public class RHQConstants {
public static final String LDAPProtocol = "CAM_LDAP_PROTOCOL";
public static final String LDAPLoginProperty = "CAM_LDAP_LOGIN_PROPERTY";
public static final String LDAPFilter = "CAM_LDAP_FILTER";
+ public static final String LDAPGroupFilter = "CAM_LDAP_GROUP_FILTER";
public static final String LDAPBaseDN = "CAM_LDAP_BASE_DN";
public static final String LDAPBindDN = "CAM_LDAP_BIND_DN";
public static final String LDAPBindPW = "CAM_LDAP_BIND_PW";
@@ -61,7 +62,8 @@ public class RHQConstants {
// Are we allowing automatic AgentUpdate binary download
public static final String EnableAgentAutoUpdate = "ENABLE_AGENT_AUTO_UPDATE";
- // Are we rendering a special "debug" menu for administrators?
+
+ // Are we rendering a special "debug" menu for administrators?
public static final String EnableDebugMode = "ENABLE_DEBUG_MODE";
// How long do we keep data compressed in hourly intervals?
commit 0df397dd638fdfbd953fb6838f2fd00c274e3de3
Author: Shannon Hughes <shughes(a)fred.hughes.lan>
Date: Mon Feb 22 10:25:46 2010 -0500
initial schema for ldap group feature
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
index 13a4bc5..dcb993b 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/authz-schema.xml
@@ -27,6 +27,18 @@
</constraint>
</table>
+ <table name="RHQ_ROLE_LDAP_GROUP_MAP">
+ <column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
+ <column name="LDAP_GROUP_NAME" required="true" type="VARCHAR2"/>
+
+ <constraint name="RHQ_ROLE_LDAP_GROUP_MAP_KEY">
+ <primaryKey>
+ <field ref="ROLE_ID"/>
+ <field ref="LDAP_GROUP_NAME"/>
+ </primaryKey>
+ </constraint>
+ </table>
+
<table name="RHQ_PERMISSION">
<column name="ROLE_ID" type="INTEGER" references="RHQ_ROLE" required="true"/>
<column name="OPERATION" type="INTEGER" required="true"/>
@@ -60,6 +72,7 @@
<table name="RHQ_SUBJECT_ROLE_MAP">
<column name="SUBJECT_ID" required="true" type="INTEGER" references="RHQ_SUBJECT"/>
<column name="ROLE_ID" required="true" type="INTEGER" references="RHQ_ROLE"/>
+ <column name="IS_LDAP" required="true" type="BOOLEAN" default="false"/>
<constraint name="RHQ_SUBJECT_ROLE_MAPPING_KEY">
<primaryKey>
14 years, 1 month
[rhq] Branch 'ldap' - 104 commits - .classpath etc/m2 modules/core modules/enterprise modules/plugins pom.xml scripts/ignore-target-dirs.js
by John Sanda
.classpath | 10
etc/m2/settings-bugfixes.xml | 54 +
modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleRequest.java | 26
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java | 3
modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleStatusUpdate.java | 33
modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml | 43
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 521 +---------
modules/core/dbutils/src/test/java/org/rhq/core/db/TypeMapTest.java | 3
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentAction.java | 4
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java | 27
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java | 11
modules/core/domain/src/main/java/org/rhq/core/domain/content/Advisory.java | 12
modules/core/domain/src/main/java/org/rhq/core/domain/content/AdvisoryPackage.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageBits.java | 10
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java | 86 +
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java | 11
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java | 23
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/EventCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDefinitionCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementScheduleCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationDefinitionCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationHistoryCriteria.java | 15
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/PackageVersionCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RepoCriteria.java | 12
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java | 92 +
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java | 12
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 76 -
modules/core/domain/src/main/java/org/rhq/core/domain/search/SavedSearch.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchContext.java | 38
modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchSubsystem.java | 66 +
modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java | 52
modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java | 53 -
modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java | 2
modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java | 23
modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java | 33
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/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java | 15
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseGroupsUIBean.java | 10
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseResourcesUIBean.java | 45
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/FavoritesUIBean.java | 12
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/ResourceUIBean.java | 5
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java | 9
modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/inventory-beans.xml | 4
modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp | 506 ++++-----
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js | 128 +-
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js | 172 +--
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js | 494 ++++-----
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js | 60 -
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js | 18
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js | 8
modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js | 20
modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/fileUpload.xhtml | 39
modules/enterprise/gui/portal-war/src/main/webapp/rhq/definition/group/library.xhtml | 1
modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/layout/summary.xhtml | 478 ++++-----
modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseGroups.xhtml | 2
modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseResources.xhtml | 11
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/create.xhtml | 230 ++--
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/file-upload.xhtml | 49
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/create-file-upload.xhtml | 52
modules/enterprise/gui/portal-war/src/main/webapp/rhq/subsystem/alertHistory.xhtml | 2
modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/InteractiveJavascriptCompletor.java | 168 +--
modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java | 4
modules/enterprise/remoting/scripts/pom.xml | 6
modules/enterprise/remoting/scripts/src/test/resources/dummy.zip |binary
modules/enterprise/remoting/scripts/src/test/resources/testBundle.war |binary
modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js | 107 ++
modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManagerZip.js | 101 +
modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_subjectManagerUserCreate.js | 116 ++
modules/enterprise/remoting/webservices/pom.xml | 13
modules/enterprise/remoting/webservices/src/main/scripts/rhq-client.build.xml | 3
modules/enterprise/server/ear/pom.xml | 6
modules/enterprise/server/jar/pom.xml | 2
modules/enterprise/server/jar/src/main/antlr3/org/rhq/enterprise/server/search/RHQL.g | 71 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/AgentClient.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java | 5
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/auth/SubjectManagerBean.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RequiredPermissionsInterceptor.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 234 ++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java | 152 --
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java | 207 +++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java | 37
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java | 75 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java | 28
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java | 44
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java | 6
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/RepoSourceSynchronizer.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNode.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNodeAdaptor.java | 34
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/AbstractSearchAssistant.java | 131 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/ResourceSearchAssistant.java | 132 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/SearchAssistant.java | 19
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchAssistManager.java | 423 ++++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchSuggestion.java | 52
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchTranslationManager.java | 268 +++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/AbstractSearchTranslator.java | 78 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/ResourceSearchTranslator.java | 76 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslator.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslatorFactory.java | 16
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLComparisonOperator.java | 10
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTerm.java | 39
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTreeOperator.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragment.java | 20
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragmentType.java | 5
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 39
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 97 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesRemote.java | 2
modules/enterprise/server/jar/src/main/resources/single-line-rhql.txt | 75 -
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 86 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java | 15
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java | 22
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java | 91 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/RHQLTest.java | 1
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/TestAutoCompletionManager.java | 71 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java | 19
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestServerCommunicationsService.java | 2
modules/enterprise/server/jar/src/test/resources/test-assist-color-number.txt | 46
modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml | 4
modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java | 2
modules/plugins/filetemplate-bundle/pom.xml | 10
modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java | 18
modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java | 4
modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java | 290 ++---
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java | 3
modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossProductType.java | 13
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
modules/plugins/pom.xml | 1
pom.xml | 12
scripts/ignore-target-dirs.js | 4
154 files changed, 5020 insertions(+), 2641 deletions(-)
New commits:
commit 59ef9c778f809c2723d3764c8dcd5bdf7660f909
Merge: d6c56f6... eb64c17...
Author: John Sanda <jsanda(a)redhat.com>
Date: Tue Mar 23 11:43:37 2010 -0400
Merge branch 'master' into ldap
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 6f189dd5afe53f5b9a41645dc41ac8b26bb35e50
Author: John Sanda <jsanda(a)redhat.com>
Date: Mon Mar 22 13:35:13 2010 -0400
Adding profile for bugfixes branch to use in hudson build
diff --git a/etc/m2/settings-bugfixes.xml b/etc/m2/settings-bugfixes.xml
new file mode 100644
index 0000000..b64aac6
--- /dev/null
+++ b/etc/m2/settings-bugfixes.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--===== a sample Maven 2 user settings file for the RHQ build =====-->
+<!-- See: http://maven.apache.org/settings.html -->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+ <!--
+ The below line can be uncommented if you want your local repo to be
+ in a more convenient location under Windows.
+ -->
+ <!--<localRepository>C:\.m2-repo</localRepository>-->
+
+ <!--
+ **************************** PROFILES ****************************
+ -->
+
+ <!--
+ See:
+ http://maven.apache.org/guides/introduction/introduction-to-profiles.html
+ and: http://docs.codehaus.org/display/MAVENUSER/Profiles
+ -->
+
+ <activeProfiles>
+ <activeProfile>test.bugfixes</activeProfile>
+ </activeProfiles>
+
+ <profiles>
+ <profile>
+ <!-- Profile to use to point test runs at a different db -->
+ <id>test.bugfixes</id>
+ <properties>
+ <rhq.test.ds.db-name>rhqbugfixes</rhq.test.ds.db-name>
+ <rhq.test.ds.connection-url>jdbc:postgresql://127.0.0.1:5432/rhqbugfixes</rhq.test.ds.connection-url>
+ <DatabaseTest.nofail>true</DatabaseTest.nofail>
+
+ <!-- comm and agent config properties -->
+ <rhq.comm.test.connectorBindPort>98989</rhq.comm.test.connectorBindPort>
+ <rhq.comm.test.connector2BindPort>62628</rhq.comm.test.connector2BindPort>
+ <agent1.cfg.file>test-agent1-cfg-mvn.xml</agent1.cfg.file>
+ <agent2.cfg.file>test-agent2-cfg-mvn.xml</agent2.cfg.file>
+ <agent1.server.bind-port>55555</agent1.server.bind-port>
+ <agent2.server.bind-port>66666</agent2.server.bind-port>
+ <agent1.communications.connector.bind-port>33333</agent1.communications.connector.bind-port>
+ <agent2.communications.connector.bind-port>44444</agent2.communications.connector.bind-port>
+ </properties>
+ </profile>
+ </profiles>
+ <pluginGroups>
+ <!--
+ This will allow you to invoke "org.rhq" Maven goals using the
+ "rhq" prefix
+ -->
+ <pluginGroup>org.rhq</pluginGroup>
+ </pluginGroups>
+</settings>
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 ba33dfa1d25f9f3e386e0f4e8124aa1654fa3a0e
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 19 17:30:50 2010 -0400
fix file upload hanging by implementing workaround for https://jira.jboss.org/jira/browse/RF-8359; upgrade RichFaces from 3.3.2.GA to 3.3.3.CR1; create fileUpload.xhtml template that is shared by both file upload pages
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/fileUpload.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/fileUpload.xhtml
new file mode 100644
index 0000000..b2b5aca
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/common/fileUpload.xhtml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+
+<ui:composition
+ template="/rhq/layout/popup.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:onc="http://jboss.org/on/component">
+
+ <ui:define name="body-area">
+
+ <rich:panel id="fileUploadPanel">
+ <f:facet name="header">
+ <h:outputText value="#{pageTitle}"/>
+ </f:facet>
+
+ <h:panelGrid columns="1" width="100%">
+ <h:form id="fileUploadForm" enctype="multipart/form-data">
+ <rich:fileUpload
+ fileUploadListener="#{fileUploadUIBean.fileUploadListener}"
+ listHeight="60px"
+ maxFilesQuantity="1"
+ immediateUpload="false"
+ autoclear="false"
+ onuploadcomplete="javascript:window.opener.location.reload();window.close()"
+ allowFlash="false">
+ </rich:fileUpload>
+ </h:form>
+ </h:panelGrid>
+ </rich:panel>
+
+ </ui:define>
+
+</ui:composition>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
index dfe7cd8..fd72919 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/create.xhtml
@@ -1,125 +1,125 @@
-<?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:a4j="http://richfaces.org/a4j"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
-<ui:composition template="/rhq/resource/layout/main.xhtml">
-
- <ui:param name="pageTitle" value="Upload New Package"/>
- <ui:param name="selectedTabName" value="Content.New"/>
- <ui:define name="content">
-
- <rich:panel id="fileUploadPanel">
- <f:facet name="header">
- <h:outputText value="Package File"/>
- </f:facet>
-
- <h:panelGrid columns="1" width="100%" rendered="${ResourceUIBean.permissions.content}">
- <rich:panel>
- <input type="button"
- class="buttonmed"
- value="UPLOAD FILE..."
- onclick="javascript:open('/rhq/resource/content/file-upload.xhtml', 'uploadwin', 'titlebar=0,toolbar=0,location=0,menubar=0,directories=0,resizable=0,height=160,width=450')"/>
- <rich:spacer width="5" />
- <h:outputText rendered="#{UploadNewPackageUIBean.fileUploaded}"
- value="File Uploaded: #{UploadNewPackageUIBean.fileItem.fileName}"/>
- </rich:panel>
- </h:panelGrid>
-
- <h:outputText rendered="#{!ResourceUIBean.permissions.content}"
- value="You do not have permissions to upload content"/>
-
- </rich:panel>
-
- <h:form id="uploadForm">
- <input type="hidden" name="id" value="${param.id}"/>
-
- <rich:panel rendered="#{CreateNewPackageUIBean.needRequestPackageDetails}">
-
- <f:facet name="header">New Package Details</f:facet>
-
- <input type="hidden" name="newPackage" value="true"/>
-
- <table>
- <tr>
- <td align="right"><b>Name*</b></td>
- <td align="left"><h:inputText value="#{CreateNewPackageUIBean.packageName}"/></td>
- </tr>
- <tr>
- <td align="right"><b>Version*</b></td>
- <td align="left"><h:inputText value="#{CreateNewPackageUIBean.version}"/></td>
- </tr>
- <tr>
- <td align="right"><b>Architecture*</b></td>
- <td align="left">
- <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedArchitectureId}">
- <f:selectItems value="#{CreateNewPackageUIBean.architectures}" />
- </h:selectOneMenu>
- </td>
- </tr>
- <tr>
- <td align="right"><b>Type*</b></td>
- <td align="left">
- <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedPackageTypeId}">
- <f:selectItems value="#{CreateNewPackageUIBean.packageTypes}" />
- </h:selectOneMenu>
- </td>
- </tr>
- </table>
-
- <div class="note-panel"><span class="required-marker-text">*</span><span> denotes a required field.</span></div>
-
- </rich:panel>
-
- <rich:panel>
-
+<?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:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/resource/layout/main.xhtml">
+
+ <ui:param name="pageTitle" value="Upload New Package"/>
+ <ui:param name="selectedTabName" value="Content.New"/>
+ <ui:define name="content">
+
+ <rich:panel id="fileUploadPanel">
+ <f:facet name="header">
+ <h:outputText value="Package File"/>
+ </f:facet>
+
+ <h:panelGrid columns="1" width="100%" rendered="${ResourceUIBean.permissions.content}">
+ <rich:panel>
+ <input type="button"
+ class="buttonmed"
+ value="UPLOAD FILE..."
+ onclick="javascript:open('/rhq/resource/content/file-upload.xhtml', 'uploadwin', 'titlebar=0,toolbar=0,location=0,menubar=0,directories=0,resizable=0,height=160,width=450')"/>
+ <rich:spacer width="5" />
+ <h:outputText rendered="#{UploadNewPackageUIBean.fileUploaded}"
+ value="File Uploaded: #{UploadNewPackageUIBean.fileItem.fileName}"/>
+ </rich:panel>
+ </h:panelGrid>
+
+ <h:outputText rendered="#{!ResourceUIBean.permissions.content}"
+ value="You do not have permissions to upload content"/>
+
+ </rich:panel>
+
+ <h:form id="uploadForm">
+ <input type="hidden" name="id" value="${param.id}"/>
+
+ <rich:panel rendered="#{CreateNewPackageUIBean.needRequestPackageDetails}">
+
+ <f:facet name="header">New Package Details</f:facet>
+
+ <input type="hidden" name="newPackage" value="true"/>
+
+ <table>
+ <tr>
+ <td align="right"><b>Name*</b></td>
+ <td align="left"><h:inputText value="#{CreateNewPackageUIBean.packageName}"/></td>
+ </tr>
+ <tr>
+ <td align="right"><b>Version*</b></td>
+ <td align="left"><h:inputText value="#{CreateNewPackageUIBean.version}"/></td>
+ </tr>
+ <tr>
+ <td align="right"><b>Architecture*</b></td>
+ <td align="left">
+ <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedArchitectureId}">
+ <f:selectItems value="#{CreateNewPackageUIBean.architectures}" />
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ <tr>
+ <td align="right"><b>Type*</b></td>
+ <td align="left">
+ <h:selectOneMenu value="#{CreateNewPackageUIBean.selectedPackageTypeId}">
+ <f:selectItems value="#{CreateNewPackageUIBean.packageTypes}" />
+ </h:selectOneMenu>
+ </td>
+ </tr>
+ </table>
+
+ <div class="note-panel"><span class="required-marker-text">*</span><span> denotes a required field.</span></div>
+
+ </rich:panel>
+
+ <rich:panel>
+
<f:facet name="header">Repository</f:facet>
-
+
<p>Select one of the following options describing in which repository the new package should be created.</p>
-
+
<input type="radio" name="repoOption" value="subscribed">Currently Subscribed Repository</input>
- <rich:spacer width="5"/>
+ <rich:spacer width="5"/>
<h:selectOneMenu value="#{CreateNewPackageUIBean.subscribedRepoId}">
<f:selectItems value="#{CreateNewPackageUIBean.subscribedRepos}" />
- </h:selectOneMenu>
- <br/>
+ </h:selectOneMenu>
+ <br/>
<input type="radio" name="repoOption" value="unsubscribed">Existing Repository</input>
- <rich:spacer width="5"/>
+ <rich:spacer width="5"/>
<h:selectOneMenu value="#{CreateNewPackageUIBean.unsubscribedRepoId}">
<f:selectItems value="#{CreateNewPackageUIBean.unsubscribedRepos}" />
- </h:selectOneMenu>
- <br/>
+ </h:selectOneMenu>
+ <br/>
<input type="radio" name="repoOption" value="new">New Repository</input>
<rich:spacer width="5"/><h:inputText value="#{CreateNewPackageUIBean.newRepoName}"/>
-
- </rich:panel>
-
- <h:panelGrid id="buttonGrid" columns="2" styleClass="buttons-table" columnClasses="button-cell">
-
- <h:commandButton style="margin-top: 10px;" value="CONTINUE"
- action="#{CreateNewPackageUIBean.createPackage}" styleClass="buttonmed"
- rendered="#{UploadNewPackageUIBean.fileUploaded}"/>
- <h:commandButton style="margin-top: 10px;" value="CONTINUE"
- disabled="true" styleClass="buttonmed-disabled"
- rendered="#{!UploadNewPackageUIBean.fileUploaded}"/>
-
- <h:commandButton style="margin-top: 10px;" value="CANCEL"
- action="#{CreateNewPackageUIBean.cancel}" styleClass="buttonmed"/>
-
- </h:panelGrid>
-
- </h:form>
-
- </ui:define>
-</ui:composition>
-
-</html>
+
+ </rich:panel>
+
+ <h:panelGrid id="buttonGrid" columns="2" styleClass="buttons-table" columnClasses="button-cell">
+
+ <h:commandButton style="margin-top: 10px;" value="CONTINUE"
+ action="#{CreateNewPackageUIBean.createPackage}" styleClass="buttonmed"
+ rendered="#{UploadNewPackageUIBean.fileUploaded}"/>
+ <h:commandButton style="margin-top: 10px;" value="CONTINUE"
+ disabled="true" styleClass="buttonmed-disabled"
+ rendered="#{!UploadNewPackageUIBean.fileUploaded}"/>
+
+ <h:commandButton style="margin-top: 10px;" value="CANCEL"
+ action="#{CreateNewPackageUIBean.cancel}" styleClass="buttonmed"/>
+
+ </h:panelGrid>
+
+ </h:form>
+
+ </ui:define>
+</ui:composition>
+
+</html>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/file-upload.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/file-upload.xhtml
index 9745ebc..2f3386c 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/file-upload.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/file-upload.xhtml
@@ -1,40 +1,19 @@
<?xml version="1.0"?>
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition
+ template="/rhq/common/fileUpload.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:onc="http://jboss.org/on/component">
-<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:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+ <ui:param name="pageTitle" value="Package File Upload"/>
+ <ui:param name="fileUploadUIBean" value="#{UploadNewPackageUIBean}"/>
- <ui:composition template="/rhq/layout/popup.xhtml">
- <ui:param name="pageTitle" value="Package File Upload"/>
-
- <ui:define name="body-area">
- <rich:panel id="fileUploadPanel">
- <f:facet name="header">
- <h:outputText value="Package File Upload"/>
- </f:facet>
-
- <h:panelGrid columns="1" width="100%">
- <rich:fileUpload
- id="contentUpload"
- fileUploadListener="#{UploadNewPackageUIBean.fileUploadListener}"
- listHeight="60px"
- maxFilesQuantity="1"
- immediateUpload="false"
- autoclear="false"
- onuploadcomplete="javascript:window.opener.location.reload();window.close()"
- allowFlash="false">
- </rich:fileUpload>
- </h:panelGrid>
- </rich:panel>
- </ui:define>
- </ui:composition>
-</html>
+</ui:composition>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/create-file-upload.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/create-file-upload.xhtml
index 12ab23c..4074817 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/create-file-upload.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/inventory/create-file-upload.xhtml
@@ -1,40 +1,18 @@
<?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:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
- <ui:composition template="/rhq/layout/popup.xhtml">
- <ui:param name="pageTitle" value="New Child Resource Package File Upload"/>
-
- <ui:define name="body-area">
- <rich:panel id="fileUploadPanel">
- <f:facet name="header">
- <h:outputText value="New Child Resource Package File Upload"/>
- </f:facet>
-
- <h:panelGrid columns="1" width="100%">
- <rich:fileUpload
- id="contentUpload"
- fileUploadListener="#{UploadNewChildPackageUIBean.fileUploadListener}"
- listHeight="60px"
- maxFilesQuantity="1"
- immediateUpload="false"
- autoclear="false"
- onuploadcomplete="javascript:window.opener.location.reload();window.close()"
- allowFlash="false">
- </rich:fileUpload>
- </h:panelGrid>
- </rich:panel>
- </ui:define>
- </ui:composition>
-</html>
+<ui:composition
+ template="/rhq/common/fileUpload.xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:c="http://java.sun.com/jstl/core"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:rich="http://richfaces.org/rich"
+ xmlns:onc="http://jboss.org/on/component">
+ <ui:param name="pageTitle" value="New Child Resource Package File Upload"/>
+ <ui:param name="fileUploadUIBean" value="#{UploadNewChildPackageUIBean}"/>
+
+</ui:composition>
diff --git a/pom.xml b/pom.xml
index e2cc42b..0574c8e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,7 +74,7 @@
<postgresql.version>8.4-701.jdbc3</postgresql.version>
<h2.version>1.1.117</h2.version>
<jtds.version>1.2.2</jtds.version>
- <richfaces.version>3.3.2.GA</richfaces.version>
+ <richfaces.version>3.3.3.CR1</richfaces.version>
<jline.version>0.9.94</jline.version>
<sigar.version>1.6.3.82</sigar.version>
<quartz.version>1.6.5</quartz.version>
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 8b08316ae6df640c4e98ace945c4b5ce165cd5ae
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 19 13:20:07 2010 -0400
Removing old, commented out code
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java
index 0359594..2c28af9 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java
@@ -54,7 +54,6 @@ import org.rhq.core.domain.configuration.definition.PropertySimpleType;
*/
public abstract class ConfigurationMaskingUtility {
-// private static final String MASKED_PROPERTY_VALUE = "\u0002MASKED\u0003";
private static final String MASKED_PROPERTY_VALUE = "___MASKED___";
/**
commit 8c0ccb0c56b0936dd483663b38e116bbb51c37f8
Merge: 5b5bf03... f988b47...
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 19 12:41:26 2010 -0400
Merge branch 'bugfixes' of ssh://git.fedorahosted.org/git/rhq/rhq into bugfixes
commit 5b5bf037d6630d144108a59f5df55a3a271c7083
Author: John Sanda <jsanda(a)redhat.com>
Date: Fri Mar 19 12:36:52 2010 -0400
Changing the masked property value since the unicode chars were getting stripped off
Password fields were masked with a value of "\u0002MASKED\u0003" prior to being rendered.
When the form is submitted though, the password property has the unicode characters stripped
off which in turn resulted in the password property not getting unmasked.
I stumbled onto this when updating the connection properties for a jboss server and I
realized that the value for the credentials property was getting lost.
diff --git a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java
index 718b06c..0359594 100644
--- a/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java
+++ b/modules/core/gui/src/main/java/org/rhq/core/gui/configuration/ConfigurationMaskingUtility.java
@@ -54,7 +54,8 @@ import org.rhq.core.domain.configuration.definition.PropertySimpleType;
*/
public abstract class ConfigurationMaskingUtility {
- private static final String MASKED_PROPERTY_VALUE = "\u0002MASKED\u0003";
+// private static final String MASKED_PROPERTY_VALUE = "\u0002MASKED\u0003";
+ private static final String MASKED_PROPERTY_VALUE = "___MASKED___";
/**
* Mask the values of all simple properties of type PASSWORD in the configuration. The configuration does not
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 f988b4721041aefe74cff16ee0d0f5e6475cdf39
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)
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 cfc3016d77b64c8d65a12acd3e15d544f76fa77d
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 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 7721e26cda6183de4191d6ca6d70379147dc70ac
Merge: db755e1... 7e4c228...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Mar 18 10:18:44 2010 -0400
Merge branch 'bundle'
commit 7e4c2286585b5af7bdb843fb6e4ce1a1e6fe56b0
Merge: b25c245... 96a5298...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Mar 18 10:13:36 2010 -0400
Merge branch 'bundle-jay' into bundle
commit b25c245e3cfb775f38f7102252d5009c270442f6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Mar 18 10:13:29 2010 -0400
LT
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
index 54f2a5b..7bdcd0d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
@@ -1,64 +1,64 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
-SimileAjax.NativeDateUnit = new Object();
-
-SimileAjax.NativeDateUnit.makeDefaultValue = function() {
- return new Date();
-};
-
-SimileAjax.NativeDateUnit.cloneValue = function(v) {
- return new Date(v.getTime());
-};
-
-SimileAjax.NativeDateUnit.getParser = function(format) {
- if (typeof format == "string") {
- format = format.toLowerCase();
- }
- return (format == "iso8601" || format == "iso 8601") ?
- SimileAjax.DateTime.parseIso8601DateTime :
- SimileAjax.DateTime.parseGregorianDateTime;
-};
-
-SimileAjax.NativeDateUnit.parseFromObject = function(o) {
- return SimileAjax.DateTime.parseGregorianDateTime(o);
-};
-
-SimileAjax.NativeDateUnit.toNumber = function(v) {
- return v.getTime();
-};
-
-SimileAjax.NativeDateUnit.fromNumber = function(n) {
- return new Date(n);
-};
-
-SimileAjax.NativeDateUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1.getTime();
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2.getTime();
- } else {
- n2 = Number(v2);
- }
-
- return n1 - n2;
-};
-
-SimileAjax.NativeDateUnit.earlier = function(v1, v2) {
- return SimileAjax.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-SimileAjax.NativeDateUnit.later = function(v1, v2) {
- return SimileAjax.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-SimileAjax.NativeDateUnit.change = function(v, n) {
- return new Date(v.getTime() + n);
-};
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
+SimileAjax.NativeDateUnit = new Object();
+
+SimileAjax.NativeDateUnit.makeDefaultValue = function() {
+ return new Date();
+};
+
+SimileAjax.NativeDateUnit.cloneValue = function(v) {
+ return new Date(v.getTime());
+};
+
+SimileAjax.NativeDateUnit.getParser = function(format) {
+ if (typeof format == "string") {
+ format = format.toLowerCase();
+ }
+ return (format == "iso8601" || format == "iso 8601") ?
+ SimileAjax.DateTime.parseIso8601DateTime :
+ SimileAjax.DateTime.parseGregorianDateTime;
+};
+
+SimileAjax.NativeDateUnit.parseFromObject = function(o) {
+ return SimileAjax.DateTime.parseGregorianDateTime(o);
+};
+
+SimileAjax.NativeDateUnit.toNumber = function(v) {
+ return v.getTime();
+};
+
+SimileAjax.NativeDateUnit.fromNumber = function(n) {
+ return new Date(n);
+};
+
+SimileAjax.NativeDateUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1.getTime();
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2.getTime();
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n1 - n2;
+};
+
+SimileAjax.NativeDateUnit.earlier = function(v1, v2) {
+ return SimileAjax.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+SimileAjax.NativeDateUnit.later = function(v1, v2) {
+ return SimileAjax.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+SimileAjax.NativeDateUnit.change = function(v, n) {
+ return new Date(v.getTime() + n);
+};
+
commit 96a5298c91a6ced21500f864a96f636973179e4b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 17 16:37:25 2010 -0400
Just added some debug logging confirming successful command handling.
diff --git a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
index f4cb102..090ea3d 100644
--- a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
+++ b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
@@ -29,6 +29,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.rhq.bundle.filetemplate.recipe.RecipeContext;
import org.rhq.bundle.filetemplate.recipe.RecipeParser;
import org.rhq.core.domain.content.PackageVersion;
@@ -45,6 +48,8 @@ import org.rhq.core.util.file.FileUtil;
*/
public class ProcessingRecipeContext extends RecipeContext {
+ private final Log log = LogFactory.getLog(this.getClass());
+
private final Map<PackageVersion, File> packageVersionFiles;
private final SystemInfo systemInfo;
private String baseWorkingDirectory;
@@ -73,12 +78,14 @@ public class ProcessingRecipeContext extends RecipeContext {
throw new RuntimeException("Failed to unbundle file [" + pe + "]: " + results);
}
// existingFile.delete(); WOULD WE WANT TO REMOVE THE COMPRESSED FILE?
+ log.debug("bundle deploy: unzipped " + existingFile + " to " + directory);
} else {
// not a zipped format - just move the file to the directory as-is
File newFile = new File(directory, filename);
if (!existingFile.renameTo(newFile)) {
throw new RuntimeException("Failed to move [" + existingFile + "] to [" + newFile + "]");
}
+ log.debug("bundle deploy: renamed " + existingFile + " to " + newFile);
}
}
@@ -92,6 +99,8 @@ public class ProcessingRecipeContext extends RecipeContext {
try {
destinationFile.getParentFile().mkdirs();
FileUtil.copyFile(sourceFile, destinationFile);
+
+ log.debug("bundle file: copied " + sourceFile + " to " + destinationFile);
} catch (Exception e) {
throw new RuntimeException("Failed to copy file [" + sourceFile + "] to [" + destinationFile + "]", e);
}
@@ -132,6 +141,8 @@ public class ProcessingRecipeContext extends RecipeContext {
if (!realizedTmpFile.renameTo(trueFile)) {
throw new RuntimeException("Failed to rename realized tmp file [" + realizedTmpFile + "]");
}
+
+ log.debug("bundle realize file: renamed realized" + realizedTmpFile + " to " + trueFile);
} catch (Exception e) {
throw new RuntimeException("Cannot realize file [" + file + "]", e);
} finally {
@@ -175,6 +186,8 @@ public class ProcessingRecipeContext extends RecipeContext {
if (results.getError() != null) {
throw new RuntimeException("Could not execute script [" + pe + "]: " + results, results.getError());
}
+
+ log.debug("bundle script: executed script [" + pe + "]");
}
@Override
@@ -191,6 +204,8 @@ public class ProcessingRecipeContext extends RecipeContext {
if (results.getError() != null) {
throw new RuntimeException("Could not execute command [" + pe + "]: " + results, results.getError());
}
+
+ log.debug("bundle command: executed command [" + pe + "]");
}
private void ensureExecutable(File scriptFile) {
commit 99a7975b4cb031510616a62060c4d2699ca33b6f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 17 14:47:43 2010 -0400
Add unique indexes to various bundle tables to avoid logical duplicates.
Also, fixed up a lot of advisory-related db-upgrade stuff left over from
the former core team. The db-upgrade, at least for this stuff, now matches
the schema definitions. Also, got the db-upgrade to run through from a
2.3.1 db on postgres. Also tweaked a couple of entity classes to match the
schema.
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index b2663d4..683c991 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -410,8 +410,8 @@
<column name="SEVERITY" size="64" type="VARCHAR2" required="false"/>
<column name="ISSUE_DATE" type="LONG" required="false"/>
<column name="UPDATE_DATE" type="LONG" required="false"/>
- <column name="CTIME" type="LONG" required="false"/>
- <column name="LAST_MODIFIED" type="LONG" required="false"/>
+ <column name="CTIME" type="LONG" required="true"/>
+ <column name="LAST_MODIFIED" type="LONG" required="true"/>
<index name="RHQ_ADVISORY_NAME_UQ" unique="true">
<field ref="ADVISORY_NAME"/>
@@ -423,23 +423,18 @@
<index name="RHQ_ADVISORY_UDATE_IDX" unique="false">
<field ref="UPDATE_DATE"/>
- </index>
-
- <index name="RHQ_ADVISORY_SYN_IDX" unique="false">
- <field ref="SYNOPSIS"/>
- </index>
-
+ </index>
</table>
<table name="RHQ_ADVISORY_PACKAGE">
- <column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
+ <column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="ADVISORY_ID" type="INTEGER" required="true" references="RHQ_ADVISORY"/>
<column name="PACKAGE_VERSION_ID" type="INTEGER" required="true" references="RHQ_PACKAGE_VERSION"/>
- <column name="LAST_MODIFIED" type="LONG" required="false"/>
+ <column name="LAST_MODIFIED" type="LONG" required="true"/>
<index name="RHQ_ADVISORY_PKG_IDX" unique="true">
<field ref="ADVISORY_ID"/>
- <field ref="PACKAGE_VERSIOn_ID"/>
+ <field ref="PACKAGE_VERSION_ID"/>
</index>
</table>
@@ -492,6 +487,11 @@
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="NAME" size="200" type="VARCHAR2" required="true"/>
<column name="RESOURCE_TYPE_ID" type="INTEGER" required="true" references="RHQ_RESOURCE_TYPE"/>
+
+ <!-- This index is for constraint, not performance -->
+ <index name="RHQ_BUNDLE_TYPE_UNIQUE" unique="true">
+ <field ref="NAME"/>
+ </index>
</table>
<!-- BUNDLE is a named piece of content that can be versioned and installed somewhere -->
@@ -501,6 +501,12 @@
<column name="DESCRIPTION" size="500" type="VARCHAR2" required="false"/>
<column name="BUNDLE_TYPE_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_TYPE"/>
<column name="REPO_ID" type="INTEGER" required="true" references="RHQ_REPO"/>
+
+ <!-- This index is for constraint, not performance -->
+ <index name="RHQ_BUNDLE_UNIQUE" unique="true">
+ <field ref="BUNDLE_TYPE_ID"/>
+ <field ref="NAME"/>
+ </index>
</table>
<!-- BUNDLE_VERSION represents an actual piece of content that needs to be installed somewhere -->
@@ -513,6 +519,13 @@
<column name="CONFIG_DEF_ID" type="INTEGER" required="false" references="RHQ_CONFIG_DEF" />
<column name="BUNDLE_ID" type="INTEGER" required="true" references="RHQ_BUNDLE"/>
<column name="DISTRIBUTION_ID" type="INTEGER" required="false" references="RHQ_DISTRIBUTION"/>
+
+ <!-- This index is for constraint, not performance -->
+ <index name="RHQ_BUNDLE_VERSION_UNIQUE" unique="true">
+ <field ref="BUNDLE_ID"/>
+ <field ref="NAME"/>
+ <field ref="VERSION"/>
+ </index>
</table>
<!-- Many-to-many table that links many repos to a particular bundle version -->
@@ -548,6 +561,12 @@
<column name="ENFORCEMENT_INTERVAL" type="INTEGER" required="false"/>
<column name="BUNDLE_VERSION_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_VERSION"/>
<column name="BUNDLE_ID" type="INTEGER" required="false" references="RHQ_BUNDLE"/>
+
+ <!-- This index is for constraint, not performance -->
+ <index name="RHQ_BUNDLE_DEPLOY_DEF_UNIQUE" unique="true">
+ <field ref="BUNDLE_VERSION_ID"/>
+ <field ref="NAME"/>
+ </index>
</table>
<!-- Represents a bundle version that is deployed on a platform resource -->
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 85fe084..23f1fbd 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -2219,337 +2219,80 @@
<!-- RHQ Advisory Representation -->
<schemaSpec version="2.71">
- <schema-directSQL>
- <statement>
- CREATE TABLE RHQ_ADVISORY_TYPE ( ID INTEGER PRIMARY KEY )
- </statement>
- </schema-directSQL>
- <schema-alterColumn table="RHQ_ADVISORY_TYPE" column="ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_TYPE" column="NAME" precision="200" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY_TYPE" column="NAME" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_TYPE" column="DESCRIPTION" precision="500" columnType="VARCHAR2" />
- <schema-directSQL>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, NAME, DESCRIPTION )
- VALUES ( 101, 'Bug Fix Advisory', 'Bug fix(RHBA) Advisory' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, NAME, DESCRIPTION )
- VALUES ( 102, 'Product Enhancement Advisory', 'Product Enhancement(RHEA) Advisory' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, NAME, DESCRIPTION )
- VALUES ( 103, 'Security Advisory', 'Security Advisory(RHSA) Advisory' )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement>
- CREATE TABLE RHQ_ADVISORY_SEVERITY ( ID INTEGER PRIMARY KEY )
- </statement>
- </schema-directSQL>
- <schema-alterColumn table="RHQ_ADVISORY_SEVERITY" column="ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_SEVERITY" column="RANK" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_SEVERITY" column="RANK" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_SEVERITY" column="LABEL" precision="40" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY_SEVERITY" column="LABEL" nullable="false" />
- <schema-directSQL>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, RANK, LABEL)
- VALUES ( 101, 0, 'errata.sev.label.critical' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, RANK, LABEL)
- VALUES ( 102, 1, 'errata.sev.label.important' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, RANK, LABEL)
- VALUES ( 103, 2, 'errata.sev.label.moderate' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_TYPE ( ID, RANK, LABEL)
- VALUES ( 104, 3, 'errata.sev.label.low' )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement>
- CREATE TABLE RHQ_ADVISORY_FILE_TYPE ( ID INTEGER PRIMARY KEY )
- </statement>
- </schema-directSQL>
- <schema-alterColumn table="RHQ_ADVISORY_FILE_TYPE" column="ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE_TYPE" column="LABEL" precision="40" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE_TYPE" column="LABEL" nullable="false" />
- <schema-directSQL>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_FILE_TYPE ( ID, LABEL)
- VALUES ( 101, 'RPM' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_FILE_TYPE ( ID, LABEL)
- VALUES ( 102, 'SRPM' )
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_FILE_TYPE ( ID, LABEL)
- VALUES ( 103, 'IMG')
- </statement>
- <statement>
- INSERT INTO
- RHQ_ADVISORY_FILE_TYPE ( ID, LABEL)
- VALUES ( 104, 'OVAL')
- </statement>
- </schema-directSQL>
<schema-createSequence name="RHQ_ADVISORY_SEQ" initial="10001" />
<schema-directSQL>
-
<statement desc="Creating table RHQ_ADVISORY">
CREATE TABLE RHQ_ADVISORY ( ID INTEGER PRIMARY KEY )
</statement>
</schema-directSQL>
+
<schema-alterColumn table="RHQ_ADVISORY" column="ID" nullable="false" columnType="INTEGER" />
<schema-addColumn table="RHQ_ADVISORY" column="ADVISORY" precision="64" columnType="VARCHAR2" />
<schema-alterColumn table="RHQ_ADVISORY" column="ADVISORY" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY" column="ADVISORY_TYPE_ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY" column="ADVISORY_TYPE_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY" column="ADVISORY_NAME" precision="64" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY" column="ADVISORY_NAME" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY" column="ADVISORY_TYPE" precision="64" columnType="VARCHAR2" />
+ <schema-alterColumn table="RHQ_ADVISORY" column="ADVISORY_TYPE" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY" column="ADVISORY_REL" precision="64" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY" column="ADVISORY_REL" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY" column="DESCRIPTION" precision="4000" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY" column="DESCRIPTION" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY" column="ADVISORY_NAME" precision="64" columnType="VARCHAR2" />
+ <schema-addColumn table="RHQ_ADVISORY" column="DESCRIPTION" precision="4000" columnType="VARCHAR2" />
<schema-addColumn table="RHQ_ADVISORY" column="SYNOPSIS" precision="4000" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY" column="SYNOPSIS" nullable="false" />
+ <schema-alterColumn table="RHQ_ADVISORY" column="SYNOPSIS" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY" column="TOPIC" precision="4000" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY" column="TOPIC" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY" column="SOLUTION" precision="4000" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY" column="SOLUTION" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY" column="SEVERITY_ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY" column="SEVERITY_ID" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY" column="SEVERITY" precision="64" columnType="VARCHAR2" />
<schema-addColumn table="RHQ_ADVISORY" column="ISSUE_DATE" columnType="LONG" />
- <schema-alterColumn table="RHQ_ADVISORY" column="ISSUE_DATE" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY" column="UPDATE_DATE" columnType="LONG" />
- <schema-alterColumn table="RHQ_ADVISORY" column="UPDATE_DATE" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY" column="CTIME" columnType="LONG" />
<schema-alterColumn table="RHQ_ADVISORY" column="CTIME" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY" column="LAST_MODIFIED" columnType="LONG" />
<schema-alterColumn table="RHQ_ADVISORY" column="LAST_MODIFIED" nullable="false" />
- <schema-directSQL>
- <statement targetDBVendor="postgresql">
- CREATE UNIQUE INDEX RHQ_ADVISORY_NAME_UQ
- ON RHQ_ADVISORY ( ADVISORY_NAME )
- </statement>
- <statement targetDBVendor="oracle">
- CREATE UNIQUE INDEX RHQ_ADVISORY_NAME_UQ
- ON RHQ_ADVISORY ( ADVISORY_NAME )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement targetDBVendor="postgresql">
- CREATE UNIQUE INDEX RHQ_ADVISORY_UQ
- ON RHQ_ADVISORY ( ADVISORY )
- </statement>
- <statement targetDBVendor="oracle">
- CREATE UNIQUE INDEX RHQ_ADVISORY_UQ
- ON RHQ_ADVISORY ( ADVISORY )
- </statement>
- </schema-directSQL>
-
- <schema-directSQL>
- <statement targetDBVendor="postgresql">
- CREATE INDEX RHQ_ADVISORY_UDATE_IDX
- ON RHQ_ADVISORY (UPDATE_DATE )
- </statement>
- <statement targetDBVendor="oracle">
- CREATE INDEX RHQ_ADVISORY_UDATE_IDX
- ON RHQ_ADVISORY (UPDATE_DATE )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement targetDBVendor="postgresql">
- CREATE INDEX RHQ_ADVISORY_SYN_IDX
- ON RHQ_ADVISORY ( SYNOPSIS )
- </statement>
- <statement targetDBVendor="oracle">
- CREATE INDEX RHQ_ADVISORY_SYN_IDX
- ON RHQ_ADVISORY ( SYNOPSIS )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY
- ADD CONSTRAINT RHQ_ADV_TYPE_FKEY
- FOREIGN KEY ( ADVISORY_TYPE_ID )
- REFERENCES RHQ_ADVISORY_TYPE ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY
- ADD CONSTRAINT RHQ_ADV_TYPE_FKEY
- FOREIGN KEY ( ADVISORY_TYPE_ID )
- REFERENCES RHQ_ADVISORY_TYPE ( ID )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY
- ADD CONSTRAINT RHQ_ADV_SEV_FKEY
- FOREIGN KEY ( SEVERITY_ID )
- REFERENCES RHQ_ADVISORY_SEVERITY ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY
- ADD CONSTRAINT RHQ_ADV_SEV_FKEY
- FOREIGN KEY ( SEVERITY_ID )
- REFERENCES RHQ_ADVISORY_SEVERITY ( ID )
- </statement>
- </schema-directSQL>
- <schema-createSequence name="RHQ_ADVISORY_FILE_SEQ" initial="10001" />
+
<schema-directSQL>
<statement>
- CREATE TABLE RHQ_ADVISORY_FILE ( ID INTEGER )
- </statement>
- </schema-directSQL>
- <schema-alterColumn table="RHQ_ADVISORY_FILE" column="ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE" column="ADVISORY_ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE" column="ADVISORY_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE" column="FILE_TYPE_ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE" column="FILE_TYPE_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE" column="RELATIVE_FILENAME" precision="256" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE" column="RELATIVE_FILENAME" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE" column="MD5SUM" precision="64" columnType="VARCHAR2" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE" column="MD5SUM" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE" column="LAST_MODIFIED" columnType="LONG" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE" column="LAST_MODIFIED" nullable="false" />
- <schema-directSQL>
- <statement targetDBVendor="postgresql">
- CREATE UNIQUE INDEX RHQ_ADVISORY_ID_FILE_UQ
- ON RHQ_ADVISORY_FILE ( ADVISORY_ID, RELATIVE_FILENAME )
- </statement>
- <statement targetDBVendor="oracle">
- CREATE UNIQUE INDEX RHQ_ADVISORY_ID_FILE_UQ
- ON RHQ_ADVISORY_FILE ( ADVISORY_ID, RELATIVE_FILENAME )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_FILE
- ADD CONSTRAINT RHQ_ADV_FILE_FKEY
- FOREIGN KEY ( ADVISORY_ID)
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_FILE
- ADD CONSTRAINT RHQ_ADV_FILE_FKEY
- FOREIGN KEY ( ADVISORY_ID)
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_FILE
- ADD CONSTRAINT RHQ_ADV_FILE_TYPE_FKEY
- FOREIGN KEY ( FILE_TYPE_ID )
- REFERENCES RHQ_ADVISORY_FILE_TYPE ( ID )
+ CREATE UNIQUE INDEX RHQ_ADVISORY_NAME_UQ ON RHQ_ADVISORY ( ADVISORY_NAME )
</statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_FILE
- ADD CONSTRAINT RHQ_ADV_FILE_TYPE_FKEY
- FOREIGN KEY ( FILE_TYPE_TYPE )
- REFERENCES RHQ_ADVISORY_FILE_TYPE ( ID )
- </statement>
- </schema-directSQL>
- <schema-directSQL>
<statement>
- CREATE TABLE RHQ_ADVISORY_PACKAGE_MAP ( ADVISORY_ID INTEGER )
- </statement>
- </schema-directSQL>
- <schema-alterColumn table="RHQ_ADVISORY_PACKAGE_MAP" column="ADVISORY_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_PACKAGE_MAP" column="PACKAGE_ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_PACKAGE_MAP" column="PACKAGE_ID" nullable="false" />
- <schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP
- ADD CONSTRAINT RHQ_ADV_PKG_MAP_KEY
- PRIMARY KEY ( ADVISORY_ID, PACKAGE_ID )
+ CREATE UNIQUE INDEX RHQ_ADVISORY_UQ ON RHQ_ADVISORY ( ADVISORY )
</statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP
- ADD CONSTRAINT RHQ_ADV_PKG_MAP_KEY
- PRIMARY KEY ( ADVISORY_ID, PACKAGE_ID )
- </statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP
- ADD FOREIGN KEY ( PACKAGE_ID )
- REFERENCES RHQ_PACKAGE ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP
- ADD FOREIGN KEY ( PACKAGE_ID )
- REFERENCES RHQ_PACKAGE ( ID )
+ <statement>
+ CREATE INDEX RHQ_ADVISORY_UDATE_IDX ON RHQ_ADVISORY (UPDATE_DATE )
</statement>
</schema-directSQL>
+ <schema-createSequence name="RHQ_ADVISORY_PACKAGE_SEQ" initial="10001" />
<schema-directSQL>
<statement>
- CREATE TABLE RHQ_ADVISORY_FILE_PKG_MAP ( ADVISORY_ID INTEGER )
+ CREATE TABLE RHQ_ADVISORY_PACKAGE ( ID INTEGER PRIMARY KEY )
</statement>
</schema-directSQL>
- <schema-alterColumn table="RHQ_ADVISORY_FILE_PKG_MAP" column="ADVISORY_FILE_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_FILE_PKG_MAP" column="PACKAGE_ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_FILE_PKG_MAP" column="PACKAGE_ID" nullable="false" />
+ <schema-alterColumn table="RHQ_ADVISORY_PACKAGE" column="ID" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY_PACKAGE" column="ADVISORY_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_ADVISORY_PACKAGE" column="ADVISORY_ID" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY_PACKAGE" column="PACKAGE_VERSION_ID" columnType="INTEGER" />
+ <schema-alterColumn table="RHQ_ADVISORY_PACKAGE" column="PACKAGE_VERSION_ID" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY_PACKAGE" column="LAST_MODIFIED" columnType="LONG" />
+ <schema-alterColumn table="RHQ_ADVISORY_PACKAGE" column="LAST_MODIFIED" nullable="false" />
<schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_FILE_PKG_MAP
- ADD CONSTRAINT RHQ_ADV_FILE_PKG_MAP_KEY
- PRIMARY KEY ( ADVISORY_FILE_ID, PACKAGE_ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_FILE_PKG_MAP
- ADD CONSTRAINT RHQ_ADV_FILE_PKG_MAP_KEY
- PRIMARY KEY ( ADVISORY_FILE_ID, PACKAGE_ID )
- </statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_FILE_PKG_MAP
- ADD FOREIGN KEY ( ADVISORY_FILE_ID )
- REFERENCES RHQ_ADVISORY_FILE ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_FILE_PKG_MAP
- ADD FOREIGN KEY ( ADVISORY_FILE_ID )
- REFERENCES RHQ_ADVISORY_FILE ( ID )
- </statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_FILE_PKG_MAP
- ADD FOREIGN KEY ( PACKAGE_ID )
- REFERENCES RHQ_PACKAGE ( ID )
+ <statement>
+ CREATE UNIQUE INDEX RHQ_ADVISORY_PACKAGE_UQ ON RHQ_ADVISORY_PACKAGE ( ADVISORY_ID, PACKAGE_VERSION_ID )
</statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_FILE_PKG_MAP
- ADD FOREIGN KEY ( PACKAGE_ID )
- REFERENCES RHQ_PACKAGE ( ID )
+ <statement>
+ ALTER TABLE RHQ_ADVISORY_PACKAGE
+ ADD CONSTRAINT RHQ_ADVISORY_FKEY
+ FOREIGN KEY ( ADVISORY_ID )
+ REFERENCES RHQ_ADVISORY ( ID )
+ </statement>
+ <statement>
+ ALTER TABLE RHQ_ADVISORY_PACKAGE
+ ADD CONSTRAINT RHQ_PACKAGE_VERSION_FKEY
+ FOREIGN KEY ( PACKAGE_VERSION_ID )
+ REFERENCES RHQ_PACKAGE_VERSION ( ID )
</statement>
</schema-directSQL>
+
<schema-createSequence name="RHQ_CVE_SEQ" initial="101" />
<schema-directSQL>
<statement>
- CREATE TABLE RHQ_CVE ( ID INTEGER )
+ CREATE TABLE RHQ_CVE ( ID INTEGER PRIMARY KEY )
</statement>
</schema-directSQL>
<schema-alterColumn table="RHQ_CVE" column="ID" nullable="false" />
@@ -2558,84 +2301,60 @@
<schema-directSQL>
<statement>
- CREATE TABLE RHQ_ADVISORY_CVE ( ADVISORY_ID INTEGER )
+ CREATE TABLE RHQ_ADVISORY_CVE ( ID INTEGER PRIMARY KEY )
</statement>
</schema-directSQL>
+ <schema-alterColumn table="RHQ_ADVISORY_CVE" column="ID" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY_CVE" column="ADVISORY_ID" columnType="INTEGER" />
<schema-alterColumn table="RHQ_ADVISORY_CVE" column="ADVISORY_ID" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY_CVE" column="CVE_ID" columnType="INTEGER" />
<schema-alterColumn table="RHQ_ADVISORY_CVE" column="CVE_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_CVE" column="CTIME" columnType="LONG" />
- <schema-alterColumn table="RHQ_ADVISORY_CVE" column="CTIME" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY_CVE" column="LAST_MODIFIED" columnType="LONG" />
<schema-alterColumn table="RHQ_ADVISORY_CVE" column="LAST_MODIFIED" nullable="false" />
<schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_CVE
- ADD CONSTRAINT RHQ_ADV_CVE_MAP_KEY
- PRIMARY KEY ( ADVISORY_ID, CVE_ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_CVE
- ADD CONSTRAINT RHQ_ADV_CVE_MAP_KEY
- PRIMARY KEY ( ADVISORY_ID, CVE_ID )
- </statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_CVE
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
+ <statement>
+ CREATE UNIQUE INDEX RHQ_ADVISORY_CVE_UQ ON RHQ_ADVISORY_CVE ( ADVISORY_ID, CVE_ID )
</statement>
- <statement targetDBVendor="postgresql">
+ <statement>
ALTER TABLE RHQ_ADVISORY_CVE
- ADD FOREIGN KEY ( ADVISORY_ID )
+ ADD CONSTRAINT RHQ_ADVISORY_FKEY
+ FOREIGN KEY ( ADVISORY_ID )
REFERENCES RHQ_ADVISORY ( ID )
</statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_CVE
- ADD FOREIGN KEY ( CVE_ID )
- REFERENCES RHQ_CVE ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_CVE
- ADD FOREIGN KEY ( CVE_ID )
- REFERENCES RHQ_CVE ( ID )
- </statement>
+ <statement>
+ ALTER TABLE RHQ_ADVISORY_CVE
+ ADD CONSTRAINT RHQ_CVE_FKEY
+ FOREIGN KEY ( CVE_ID )
+ REFERENCES RHQ_CVE ( ID )
+ </statement>
</schema-directSQL>
+ <schema-createSequence name="RHQ_ADVISORY_BUGLIST_SEQ" initial="10001" />
<schema-directSQL>
<statement>
- CREATE TABLE RHQ_ADVISORY_BUGLIST ( ADVISORY_ID INTEGER )
+ CREATE TABLE RHQ_ADVISORY_BUGLIST ( ID INTEGER PRIMARY KEY)
</statement>
</schema-directSQL>
+ <schema-alterColumn table="RHQ_ADVISORY_BUGLIST" column="ID" nullable="false" />
+ <schema-addColumn table="RHQ_ADVISORY_BUGLIST" column="ADVISORY_ID" columnType="INTEGER" />
<schema-alterColumn table="RHQ_ADVISORY_BUGLIST" column="ADVISORY_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_BUGLIST" column="BUG_ID" columnType="INTEGER" />
+ <schema-addColumn table="RHQ_ADVISORY_BUGLIST" column="BUG_ID" PRECISION="256" columnType="VARCHAR2" />
<schema-alterColumn table="RHQ_ADVISORY_BUGLIST" column="BUG_ID" nullable="false" />
- <schema-addColumn table="RHQ_ADVISORY_BUGLIST" column="CTIME" columnType="LONG" />
- <schema-alterColumn table="RHQ_ADVISORY_BUGLIST" column="CTIME" nullable="false" />
<schema-addColumn table="RHQ_ADVISORY_BUGLIST" column="LAST_MODIFIED" columnType="LONG" />
<schema-alterColumn table="RHQ_ADVISORY_BUGLIST" column="LAST_MODIFIED" nullable="false" />
<schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_BUGLIST
- ADD CONSTRAINT RHQ_ADV_BUG_LIST_KEY
- PRIMARY KEY ( ADVISORY_ID, BUG_ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_BUGLIST
- ADD CONSTRAINT RHQ_ADV_BUG_LIST_KEY
- PRIMARY KEY ( ADVISORY_ID, BUG_ID )
- </statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_ADVISORY_BUGLIST
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_ADVISORY_BUGLIST
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
+ <statement>
+ CREATE UNIQUE INDEX RHQ_ADVISORY_BUGLIST_UQ ON RHQ_ADVISORY_BUGLIST ( ADVISORY_ID, BUG_ID )
+ </statement>
+ <statement>
+ ALTER TABLE RHQ_ADVISORY_BUGLIST
+ ADD CONSTRAINT RHQ_ADVISORY_FKEY
+ FOREIGN KEY ( ADVISORY_ID )
+ REFERENCES RHQ_ADVISORY ( ID )
+ </statement>
</schema-directSQL>
+
<schema-directSQL>
<statement>
CREATE TABLE RHQ_REPO_ADVISORY ( REPO_ID INTEGER )
@@ -2644,40 +2363,25 @@
<schema-alterColumn table="RHQ_REPO_ADVISORY" column="REPO_ID" nullable="false" />
<schema-addColumn table="RHQ_REPO_ADVISORY" column="ADVISORY_ID" columnType="INTEGER" />
<schema-alterColumn table="RHQ_REPO_ADVISORY" column="ADVISORY_ID" nullable="false" />
- <schema-addColumn table="RHQ_REPO_ADVISORY" column="CTIME" columnType="LONG" />
- <schema-alterColumn table="RHQ_REPO_ADVISORY" column="CTIME" nullable="false" />
<schema-addColumn table="RHQ_REPO_ADVISORY" column="LAST_MODIFIED" columnType="LONG" />
<schema-alterColumn table="RHQ_REPO_ADVISORY" column="LAST_MODIFIED" nullable="false" />
<schema-directSQL>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_REPO_ADVISORY
- ADD CONSTRAINT RHQ_REPO_ADV_MAP_KEY
- PRIMARY KEY ( REPO_ID, ADVISORY_ID )
- </statement>
- <statement targetDBVendor="postgresql">
+ <statement>
ALTER TABLE RHQ_REPO_ADVISORY
ADD CONSTRAINT RHQ_REPO_ADV_MAP_KEY
PRIMARY KEY ( REPO_ID, ADVISORY_ID )
</statement>
- <statement targetDBVendor="oracle">
- ALTER TABLE RHQ_REPO_ADVISORY
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- <statement targetDBVendor="postgresql">
- ALTER TABLE RHQ_REPO_ADVISORY
- ADD FOREIGN KEY ( ADVISORY_ID )
- REFERENCES RHQ_ADVISORY ( ID )
- </statement>
- <statement targetDBVendor="oracle">
+ <statement>
ALTER TABLE RHQ_REPO_ADVISORY
- ADD FOREIGN KEY ( REPO_ID )
+ ADD CONSTRAINT RHQ_REPO_FKEY
+ FOREIGN KEY ( REPO_ID )
REFERENCES RHQ_REPO ( ID )
</statement>
- <statement targetDBVendor="postgresql">
+ <statement>
ALTER TABLE RHQ_REPO_ADVISORY
- ADD FOREIGN KEY ( REPO_ID )
- REFERENCES RHQ_REPO ( ID )
+ ADD CONSTRAINT RHQ_ADVISORY_FKEY
+ FOREIGN KEY ( ADVISORY_ID )
+ REFERENCES RHQ_ADVISORY ( ID )
</statement>
</schema-directSQL>
</schemaSpec>
@@ -2710,54 +2414,6 @@
</schema-directSQL>
</schemaSpec>
- <schemaSpec version="2.74">
- <schema-createSequence name="RHQ_ADVISORY_ID_SEQ" initial="10001" />
- <schema-createSequence name="RHQ_ADVISORY_CVE_ID_SEQ" initial="10001" />
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_CVE DROP CONSTRAINT RHQ_ADV_CVE_MAP_KEY
- </statement>
- </schema-directSQL>
- <schema-addColumn table="RHQ_ADVISORY_CVE" column="ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_CVE" column="ID" nullable="false" />
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_CVE ALTER COLUMN ID SET DEFAULT NEXTVAL('RHQ_ADVISORY_CVE_SEQ')
- </statement>
- </schema-directSQL>
- <schema-createSequence name="RHQ_ADVISORY_BUGLIST_ID_SEQ" initial="10001" />
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_BUGLIST DROP CONSTRAINT RHQ_ADV_BUG_LIST_KEY
- </statement>
- </schema-directSQL>
- <schema-addColumn table="RHQ_ADVISORY_BUGLIST" column="ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_BUGLIST" column="ID" nullable="false" />
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_BUGLIST ALTER COLUMN ID SET DEFAULT NEXTVAL('RHQ_ADVISORY_BUG_SEQ')
- </statement>
- </schema-directSQL>
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_PACKAGE_MAP RENAME TO RHQ_ADVISORY_PACKAGE
- </statement>
- </schema-directSQL>
- <schema-createSequence name="RHQ_ADVISORY_PACKAGE_ID_SEQ" initial="10001" />
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_PACKAGE DROP CONSTRAINT RHQ_ADV_PKG_MAP_KEY
- </statement>
- </schema-directSQL>
- <schema-addColumn table="RHQ_ADVISORY_PACKAGE" column="ID" columnType="INTEGER" />
- <schema-alterColumn table="RHQ_ADVISORY_PACKAGE" column="ID" nullable="false" />
- <schema-directSQL>
- <statement>
- ALTER TABLE RHQ_ADVISORY_PACKAGE ALTER COLUMN ID SET DEFAULT NEXTVAL('RHQ_ADVISORY_PKG_SEQ')
- </statement>
- </schema-directSQL>
- </schemaSpec>
-
<schemaSpec version="2.75">
<schema-addColumn table="RHQ_REPO" column="SYNC_SCHEDULE" columnType="VARCHAR2" precision="64" />
</schemaSpec>
@@ -3211,6 +2867,32 @@
<schema-addColumn table="RHQ_BUNDLE_VERSION" column="DESCRIPTION" columnType="VARCHAR2" precision="500" />
</schemaSpec>
+ <schemaSpec version="2.78.3">
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE_TYPE unique constraint">
+ CREATE UNIQUE INDEX RHQ_BUNDLE_TYPE_UNIQUE ON RHQ_BUNDLE_TYPE (name)
+ </statement>
+ </schema-directSQL>
+
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE unique constraint">
+ CREATE UNIQUE INDEX RHQ_BUNDLE_UNIQUE ON RHQ_BUNDLE (bundle_type_id, name)
+ </statement>
+ </schema-directSQL>
+
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE_VERSION unique constraint">
+ CREATE UNIQUE INDEX RHQ_BUNDLE_VERSION_UNIQUE ON RHQ_BUNDLE_VERSION (bundle_id, name, version)
+ </statement>
+ </schema-directSQL>
+
+ <schema-directSQL>
+ <statement desc="Creating RHQ_BUNDLE_DEPLOY_DEF unique constraint">
+ CREATE UNIQUE INDEX RHQ_BUNDLE_DEPLOY_DEF_UNIQUE ON RHQ_BUNDLE_DEPLOY_DEF (bundle_version_id, name)
+ </statement>
+ </schema-directSQL>
+ </schemaSpec>
+
<schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/Advisory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/Advisory.java
index 32d2518..205d1cc 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/Advisory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/Advisory.java
@@ -89,10 +89,10 @@ public class Advisory implements Serializable {
@Column(name = "UPDATE_DATE", nullable = true)
private long update_date;
- @Column(name = "CTIME", nullable = true)
+ @Column(name = "CTIME", nullable = false)
private long ctime;
- @Column(name = "LAST_MODIFIED", nullable = true)
+ @Column(name = "LAST_MODIFIED", nullable = false)
private long lastModifiedDate;
@OneToMany(mappedBy = "advisory", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@@ -264,9 +264,15 @@ public class Advisory implements Serializable {
return true;
}
+ public long getCtime() {
+ return ctime;
+ }
+
@PrePersist
void onPersist() {
- this.setLastModifiedDate(System.currentTimeMillis());
+ long now = System.currentTimeMillis();
+ this.ctime = now;
+ this.setLastModifiedDate(now);
}
@PreUpdate
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/AdvisoryPackage.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/AdvisoryPackage.java
index 17bd2d8..2185c65 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/AdvisoryPackage.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/AdvisoryPackage.java
@@ -79,7 +79,7 @@ public class AdvisoryPackage implements Serializable {
@JoinColumn(name = "PACKAGE_VERSION_ID", referencedColumnName = "ID", nullable = false)
private PackageVersion pkg;
- @Column(name = "LAST_MODIFIED", nullable = true)
+ @Column(name = "LAST_MODIFIED", nullable = false)
private long lastModifiedDate;
protected AdvisoryPackage() {
commit b2cc4bca855a6a34e22f4b64ceea0f61638a4608
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Mar 17 14:53:04 2010 -0400
LT
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
index 54f2a5b..7bdcd0d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
@@ -1,64 +1,64 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
-SimileAjax.NativeDateUnit = new Object();
-
-SimileAjax.NativeDateUnit.makeDefaultValue = function() {
- return new Date();
-};
-
-SimileAjax.NativeDateUnit.cloneValue = function(v) {
- return new Date(v.getTime());
-};
-
-SimileAjax.NativeDateUnit.getParser = function(format) {
- if (typeof format == "string") {
- format = format.toLowerCase();
- }
- return (format == "iso8601" || format == "iso 8601") ?
- SimileAjax.DateTime.parseIso8601DateTime :
- SimileAjax.DateTime.parseGregorianDateTime;
-};
-
-SimileAjax.NativeDateUnit.parseFromObject = function(o) {
- return SimileAjax.DateTime.parseGregorianDateTime(o);
-};
-
-SimileAjax.NativeDateUnit.toNumber = function(v) {
- return v.getTime();
-};
-
-SimileAjax.NativeDateUnit.fromNumber = function(n) {
- return new Date(n);
-};
-
-SimileAjax.NativeDateUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1.getTime();
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2.getTime();
- } else {
- n2 = Number(v2);
- }
-
- return n1 - n2;
-};
-
-SimileAjax.NativeDateUnit.earlier = function(v1, v2) {
- return SimileAjax.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-SimileAjax.NativeDateUnit.later = function(v1, v2) {
- return SimileAjax.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-SimileAjax.NativeDateUnit.change = function(v, n) {
- return new Date(v.getTime() + n);
-};
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
+SimileAjax.NativeDateUnit = new Object();
+
+SimileAjax.NativeDateUnit.makeDefaultValue = function() {
+ return new Date();
+};
+
+SimileAjax.NativeDateUnit.cloneValue = function(v) {
+ return new Date(v.getTime());
+};
+
+SimileAjax.NativeDateUnit.getParser = function(format) {
+ if (typeof format == "string") {
+ format = format.toLowerCase();
+ }
+ return (format == "iso8601" || format == "iso 8601") ?
+ SimileAjax.DateTime.parseIso8601DateTime :
+ SimileAjax.DateTime.parseGregorianDateTime;
+};
+
+SimileAjax.NativeDateUnit.parseFromObject = function(o) {
+ return SimileAjax.DateTime.parseGregorianDateTime(o);
+};
+
+SimileAjax.NativeDateUnit.toNumber = function(v) {
+ return v.getTime();
+};
+
+SimileAjax.NativeDateUnit.fromNumber = function(n) {
+ return new Date(n);
+};
+
+SimileAjax.NativeDateUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1.getTime();
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2.getTime();
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n1 - n2;
+};
+
+SimileAjax.NativeDateUnit.earlier = function(v1, v2) {
+ return SimileAjax.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+SimileAjax.NativeDateUnit.later = function(v1, v2) {
+ return SimileAjax.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+SimileAjax.NativeDateUnit.change = function(v, n) {
+ return new Date(v.getTime() + n);
+};
+
commit db755e175a0b6db356ca2404fce0e5ae40c1dc33
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 16 11:33:40 2010 -0400
LT
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
index 54f2a5b..7bdcd0d 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/ajax/api/scripts/units.js
@@ -1,64 +1,64 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
-SimileAjax.NativeDateUnit = new Object();
-
-SimileAjax.NativeDateUnit.makeDefaultValue = function() {
- return new Date();
-};
-
-SimileAjax.NativeDateUnit.cloneValue = function(v) {
- return new Date(v.getTime());
-};
-
-SimileAjax.NativeDateUnit.getParser = function(format) {
- if (typeof format == "string") {
- format = format.toLowerCase();
- }
- return (format == "iso8601" || format == "iso 8601") ?
- SimileAjax.DateTime.parseIso8601DateTime :
- SimileAjax.DateTime.parseGregorianDateTime;
-};
-
-SimileAjax.NativeDateUnit.parseFromObject = function(o) {
- return SimileAjax.DateTime.parseGregorianDateTime(o);
-};
-
-SimileAjax.NativeDateUnit.toNumber = function(v) {
- return v.getTime();
-};
-
-SimileAjax.NativeDateUnit.fromNumber = function(n) {
- return new Date(n);
-};
-
-SimileAjax.NativeDateUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1.getTime();
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2.getTime();
- } else {
- n2 = Number(v2);
- }
-
- return n1 - n2;
-};
-
-SimileAjax.NativeDateUnit.earlier = function(v1, v2) {
- return SimileAjax.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-SimileAjax.NativeDateUnit.later = function(v1, v2) {
- return SimileAjax.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-SimileAjax.NativeDateUnit.change = function(v, n) {
- return new Date(v.getTime() + n);
-};
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
+SimileAjax.NativeDateUnit = new Object();
+
+SimileAjax.NativeDateUnit.makeDefaultValue = function() {
+ return new Date();
+};
+
+SimileAjax.NativeDateUnit.cloneValue = function(v) {
+ return new Date(v.getTime());
+};
+
+SimileAjax.NativeDateUnit.getParser = function(format) {
+ if (typeof format == "string") {
+ format = format.toLowerCase();
+ }
+ return (format == "iso8601" || format == "iso 8601") ?
+ SimileAjax.DateTime.parseIso8601DateTime :
+ SimileAjax.DateTime.parseGregorianDateTime;
+};
+
+SimileAjax.NativeDateUnit.parseFromObject = function(o) {
+ return SimileAjax.DateTime.parseGregorianDateTime(o);
+};
+
+SimileAjax.NativeDateUnit.toNumber = function(v) {
+ return v.getTime();
+};
+
+SimileAjax.NativeDateUnit.fromNumber = function(n) {
+ return new Date(n);
+};
+
+SimileAjax.NativeDateUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1.getTime();
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2.getTime();
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n1 - n2;
+};
+
+SimileAjax.NativeDateUnit.earlier = function(v1, v2) {
+ return SimileAjax.NativeDateUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+SimileAjax.NativeDateUnit.later = function(v1, v2) {
+ return SimileAjax.NativeDateUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+SimileAjax.NativeDateUnit.change = function(v, n) {
+ return new Date(v.getTime() + n);
+};
+
commit 57e64d4c326ffaa24d2744e7aa230d852c929d6e
Merge: 7115e82... a2469d3...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 14:25:26 2010 -0400
Merge branch 'master-jay'
commit a2469d3a1ac9ae739edd4ab1f8400422bef517c9
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 14:24:34 2010 -0400
Make test aware of new LARGEOBJECT type map
diff --git a/modules/core/dbutils/src/test/java/org/rhq/core/db/TypeMapTest.java b/modules/core/dbutils/src/test/java/org/rhq/core/db/TypeMapTest.java
index 5f6f063..75c40f7 100644
--- a/modules/core/dbutils/src/test/java/org/rhq/core/db/TypeMapTest.java
+++ b/modules/core/dbutils/src/test/java/org/rhq/core/db/TypeMapTest.java
@@ -20,6 +20,7 @@ package org.rhq.core.db;
import java.io.InputStream;
import java.util.Collection;
+
import org.testng.annotations.Test;
/**
@@ -52,7 +53,7 @@ public class TypeMapTest {
*/
public void testLoadKnown() {
Collection<TypeMap> mapping = TypeMap.loadKnownTypeMaps();
- assert mapping.size() == 13 : "Wrong number of mappings returned: " + mapping.size();
+ assert mapping.size() == 14 : "Wrong number of mappings returned: " + mapping.size();
DatabaseType oracle = new Oracle10DatabaseType();
DatabaseType postgres = new Postgresql8DatabaseType();
commit 7115e8215af75bef4298fe2f824e92e2f1d636b5
Merge: 3068b0c... 7131280...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 14:19:09 2010 -0400
Merge branch 'master-jay'
commit 71312807ad72d8a2db7d1db41beb8ee740eb8a6d
Merge: 8805397... 226da3e...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 14:18:54 2010 -0400
Merge branch 'bundle' into master-jay
commit 226da3ea89df486c9c2d0473f9508a2e2b6d1a7a
Merge: c2a8935... 09475ba...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 14:17:13 2010 -0400
Merge branch 'bundle-jay' into bundle
commit 09475ba84232537da0cb1797769999c91d2ac5a8
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 14:16:50 2010 -0400
bring some domain test back to reality
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java
index 5b95575..9da25eb 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/bundle/test/BundleTest.java
@@ -67,7 +67,11 @@ public class BundleTest extends AbstractEJB3Test {
assert q.getResultList().size() == 0 : "should not have repo2 mapping in the db yet";
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
+
+ Repo bundleRepo = new Repo(name + "-Bundle");
+ em.persist(bundleRepo);
Bundle bundle = new Bundle(name + "-Bundle", bundleType);
+ bundle.setRepo(bundleRepo);
em.persist(bundle);
BundleVersion bundleVersion = new BundleVersion(name, "1.0.0.BETA", bundle, recipe);
em.persist(bundleVersion);
@@ -129,8 +133,12 @@ public class BundleTest extends AbstractEJB3Test {
String name = "BundleTest-testBundleVersion";
String recipe = "action/script/recipe is here";
+ Repo repo1 = new Repo(name + "-Repo1");
+ em.persist(repo1);
+
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
Bundle bundle = new Bundle(name + "-Bundle", bundleType);
+ bundle.setRepo(repo1);
em.persist(bundle);
id = bundle.getId();
assert id > 0;
@@ -181,8 +189,7 @@ public class BundleTest extends AbstractEJB3Test {
// clean up - delete our test entity
em.close();
- getTransactionManager().commit();
- getTransactionManager().begin();
+
em = getEntityManager();
q = em.createNamedQuery(BundleVersion.QUERY_FIND_BY_NAME);
q.setParameter("name", bv.getName());
@@ -191,10 +198,8 @@ public class BundleTest extends AbstractEJB3Test {
em.remove(doomed);
assert q.getResultList().size() == 0 : "didn't remove the entity";
em.close();
- getTransactionManager().commit();
// make sure we didn't delete the bundle - it should not be cascade deleted
- getTransactionManager().begin();
em = getEntityManager();
q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", bundle.getName());
@@ -208,16 +213,12 @@ public class BundleTest extends AbstractEJB3Test {
deleteResourceType(em, bundleType.getResourceType());
em.close();
- getTransactionManager().commit();
- done = true;
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
- if (!done) {
- getTransactionManager().rollback();
- }
+ getTransactionManager().rollback();
}
}
@@ -235,8 +236,12 @@ public class BundleTest extends AbstractEJB3Test {
assert q.getResultList().size() == 0; // not in the db yet
BundleType bundleType = createBundleType(em, name + "-Type", createResourceType(em));
- Bundle b = new Bundle(name, bundleType);
+ Repo bundleRepo = new Repo(name);
+ em.persist(bundleRepo);
+
+ Bundle b = new Bundle(name, bundleType);
+ b.setRepo(bundleRepo);
em.persist(b);
id = b.getId();
assert id > 0;
@@ -259,8 +264,7 @@ public class BundleTest extends AbstractEJB3Test {
// clean up - delete our test entity
em.close();
- getTransactionManager().commit();
- getTransactionManager().begin();
+
em = getEntityManager();
q = em.createNamedQuery(Bundle.QUERY_FIND_BY_NAME);
q.setParameter("name", b.getName());
@@ -269,10 +273,8 @@ public class BundleTest extends AbstractEJB3Test {
em.remove(doomed);
assert q.getResultList().size() == 0 : "didn't remove the entity";
em.close();
- getTransactionManager().commit();
// make sure we didn't delete the bundle type - it should not be cascade deleted
- getTransactionManager().begin();
em = getEntityManager();
q = em.createNamedQuery(BundleType.QUERY_FIND_BY_NAME);
q.setParameter("name", bFind.getBundleType().getName());
@@ -283,25 +285,18 @@ public class BundleTest extends AbstractEJB3Test {
deleteResourceType(em, bundleType.getResourceType());
em.close();
- getTransactionManager().commit();
- // make sure we did cascade delete the repo
- getTransactionManager().begin();
+ // make sure we didn't cascade delete the repo, it must also be deleted manually
em = getEntityManager();
q = em.createNamedQuery(Repo.QUERY_FIND_BY_NAME);
q.setParameter("name", bFind.getRepo().getName());
- assert q.getResultList().size() == 0 : "didn't clean up test repo";
+ assert q.getResultList().size() == 1 : "didn't clean up test repo";
em.close();
- getTransactionManager().commit();
-
- done = true;
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
- if (!done) {
- getTransactionManager().rollback();
- }
+ getTransactionManager().rollback();
}
}
@@ -337,8 +332,7 @@ public class BundleTest extends AbstractEJB3Test {
// clean up - delete our test entity
em.close();
- getTransactionManager().commit();
- getTransactionManager().begin();
+
em = getEntityManager();
q = em.createNamedQuery(BundleType.QUERY_FIND_BY_NAME);
q.setParameter("name", bt.getName());
@@ -349,15 +343,11 @@ public class BundleTest extends AbstractEJB3Test {
deleteResourceType(em, bt.getResourceType());
em.close();
- getTransactionManager().commit();
- done = true;
} catch (Throwable t) {
t.printStackTrace();
throw t;
} finally {
- if (!done) {
- getTransactionManager().rollback();
- }
+ getTransactionManager().rollback();
}
}
commit 3068b0c7d659e41b9352d4120b9dd32f9a69d9c1
Merge: 2be34bf... 8805397...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:31:01 2010 -0400
Merge branch 'master-jay'
commit 2be34bfd199ff1088c8b461a76916f35458cb22e
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:30:47 2010 -0400
LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
index 6d6be4a..ae79536 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
@@ -1,253 +1,253 @@
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
-<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
-<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
-<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
-<%@ page import="javax.naming.InitialContext" %>
-<%@ page import="javax.persistence.EntityManager" %>
-<%@ page import="javax.persistence.EntityManagerFactory" %>
-<%@ page import="javax.persistence.Id" %>
-<%@ page import="java.beans.BeanInfo" %>
-<%@ page import="java.beans.Introspector" %>
-<%@ page import="java.beans.PropertyDescriptor" %>
-<%@ page import="java.beans.PropertyEditor" %>
-<%@ page import="java.beans.PropertyEditorManager" %>
-<%@ page import="java.lang.reflect.Field" %>
-<%@ page import="java.lang.reflect.Method" %>
-<%@ page import="java.util.Collection" %>
-<%@ page import="java.util.Iterator" %>
-<%@ page import="java.util.List" %>
-<%@ page import="java.util.Map" %>
-<%@ page import="java.util.SortedSet" %>
-<%@ page import="java.util.TreeSet" %>
-<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>EJB3 Entity browser</title>
- </head>
- <body>
-
- <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
-
- <h1>Entity browser</h1>
- ${param.entityClass}
-
- <c:if test="${param.pEntity != null}">
- <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
- <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
- </c:if>
-
- <%
- InitialContext ic = new InitialContext();
-
- EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
- EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
- .createEntityManager();
-
-
- org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
- SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
-
- %>
-
-
- <c:if test="${param.entityClass == null}">
- <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
-
- <%
-
- Map<String, Object> metadata = sfi.getAllClassMetadata();
- SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
-
- %>
-
- <ul>
-
- <%
- for (String className : classes) {
- Object val = metadata.get(className);
- String url = "browser.jsp?entityClass=" + className;
-
- className = className.replaceFirst(".*\\.(.*\\..*)","$1");
-
- out.println(
- " <li><a href=\"" + url + "\">" + className +"</a></li>");
- }
- %>
-
-
- </ul>
- </c:if>
-
-
- <c:if test="${param.entityClass != null}">
- <c:set var="entityClass" value="${param.entityClass}"/>
- </c:if>
-
- <c:if test="${param.mode == 'delete'}">
- <%
- String entityName = (String)pageContext.getRequest().getParameter("entityClass");
- String key = (String)pageContext.getRequest().getParameter("key");
-
- em.remove(em.find(Class.forName(entityName),key));
- entityName = (String) pageContext.getRequest().getParameter("pEntity");
- key = (String) pageContext.getRequest().getParameter("pKey");
- ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
- "browser.jsp?entityClass=" + entityName + "&key=" + key);
- if (true)
- return;
- %></c:if>
-
-
- <c:if test="${param.key == null}">
- <h3>Listing ${entityClass}</h3>
- <%
- String entityName = (String)pageContext.findAttribute("entityClass");
- entityName = entityName.substring(entityName.lastIndexOf('.')+1);
- List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
-
- pageContext.setAttribute("values", values);%>
- <c:forEach var="entity" items="${values}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
- <a href="${url}">${entity}</a><br>
- </c:forEach>
-
- </c:if>
-
- <c:if test="${param.key != null}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
- <h3>Details of ${entityClass} (${param.key})</h3>
- <a href="${url}">List all ${entityClass}</a><br>
- <%
- Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
- Object entity = em.find(entityType,
- getConvertedKey(entityType,
- pageContext.getRequest().getParameter("key")));
- pageContext.setAttribute("entity",entity);
-
-
- BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
- PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
- int ln = pds.length;
- %>
- <c:set var="entity" value="${entity}"/>
- String view: ${entity}
-
- <h4>Simple Properties</h4>
- <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
- <%
- int i = 0;
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
-
- if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
- out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
-
- Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
- if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
- java.lang.reflect.Method idMethod = null;
- try {
- idMethod = reference.getClass().getMethod("getId", new Class[0]);
- } catch (NoSuchMethodException nsme) { }
- if (idMethod != null) {
- try {
- Object id = idMethod.invoke(reference,new Object[0]);
- pageContext.setAttribute("child", reference);
- String className = reference.getClass().getName();
- if (className.indexOf('_') > 0) {
- className = className.substring(0,className.indexOf('_'));
- }
- pageContext.setAttribute("cType", className);
-
- %>
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a><br>
- <%
- } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
-
- out.println("</td></tr>");
- }
- }
- %>
- </table>
-
-
- <%
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
- if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
- out.println("<h4>" + pd.getName() + ": </h4><ul>");
-
- Method readMethod = pd.getReadMethod();
- if (readMethod != null) {
- Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
- for (Iterator iter = c.iterator(); iter.hasNext(); ) {
- Object child = iter.next();
- pageContext.setAttribute("child", child);
- pageContext.setAttribute("cType", child.getClass().getName());
- %>
- <c:catch var="foo">
- <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a>
-
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
- <a href="${url}"><font color="red">x</font></a>
-
- </li>
- </c:catch>
- <%
- }
- }
- out.write("</ul>");
- }
- }
- %>
-
-
- </c:if>
-
-
- <%!
- public Object getConvertedKey(Class type, Object key) {
- Class keyType = getKeyType(type);
- System.out.println("Key type is: " + keyType);
- PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
- if (ed != null) {
- ed.setAsText(String.valueOf(key));
- return ed.getValue();
- } else {
- return key;
- }
- }
-
- public Class getKeyType(Class type) {
- Field[] fields = type.getDeclaredFields();
- for (Field f : fields) {
- Id id = f.getAnnotation(javax.persistence.Id.class);
- if (id != null) {
- return f.getType();
- }
- }
-
- return Integer.class;
- }
-
- %>
- </body>
-</html>
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
+<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
+<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
+<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
+<%@ page import="javax.naming.InitialContext" %>
+<%@ page import="javax.persistence.EntityManager" %>
+<%@ page import="javax.persistence.EntityManagerFactory" %>
+<%@ page import="javax.persistence.Id" %>
+<%@ page import="java.beans.BeanInfo" %>
+<%@ page import="java.beans.Introspector" %>
+<%@ page import="java.beans.PropertyDescriptor" %>
+<%@ page import="java.beans.PropertyEditor" %>
+<%@ page import="java.beans.PropertyEditorManager" %>
+<%@ page import="java.lang.reflect.Field" %>
+<%@ page import="java.lang.reflect.Method" %>
+<%@ page import="java.util.Collection" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.Map" %>
+<%@ page import="java.util.SortedSet" %>
+<%@ page import="java.util.TreeSet" %>
+<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>EJB3 Entity browser</title>
+ </head>
+ <body>
+
+ <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
+
+ <h1>Entity browser</h1>
+ ${param.entityClass}
+
+ <c:if test="${param.pEntity != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
+ <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
+ </c:if>
+
+ <%
+ InitialContext ic = new InitialContext();
+
+ EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
+ EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
+ .createEntityManager();
+
+
+ org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
+ SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
+
+ %>
+
+
+ <c:if test="${param.entityClass == null}">
+ <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
+
+ <%
+
+ Map<String, Object> metadata = sfi.getAllClassMetadata();
+ SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
+
+ %>
+
+ <ul>
+
+ <%
+ for (String className : classes) {
+ Object val = metadata.get(className);
+ String url = "browser.jsp?entityClass=" + className;
+
+ className = className.replaceFirst(".*\\.(.*\\..*)","$1");
+
+ out.println(
+ " <li><a href=\"" + url + "\">" + className +"</a></li>");
+ }
+ %>
+
+
+ </ul>
+ </c:if>
+
+
+ <c:if test="${param.entityClass != null}">
+ <c:set var="entityClass" value="${param.entityClass}"/>
+ </c:if>
+
+ <c:if test="${param.mode == 'delete'}">
+ <%
+ String entityName = (String)pageContext.getRequest().getParameter("entityClass");
+ String key = (String)pageContext.getRequest().getParameter("key");
+
+ em.remove(em.find(Class.forName(entityName),key));
+ entityName = (String) pageContext.getRequest().getParameter("pEntity");
+ key = (String) pageContext.getRequest().getParameter("pKey");
+ ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
+ "browser.jsp?entityClass=" + entityName + "&key=" + key);
+ if (true)
+ return;
+ %></c:if>
+
+
+ <c:if test="${param.key == null}">
+ <h3>Listing ${entityClass}</h3>
+ <%
+ String entityName = (String)pageContext.findAttribute("entityClass");
+ entityName = entityName.substring(entityName.lastIndexOf('.')+1);
+ List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
+
+ pageContext.setAttribute("values", values);%>
+ <c:forEach var="entity" items="${values}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
+ <a href="${url}">${entity}</a><br>
+ </c:forEach>
+
+ </c:if>
+
+ <c:if test="${param.key != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
+ <h3>Details of ${entityClass} (${param.key})</h3>
+ <a href="${url}">List all ${entityClass}</a><br>
+ <%
+ Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
+ Object entity = em.find(entityType,
+ getConvertedKey(entityType,
+ pageContext.getRequest().getParameter("key")));
+ pageContext.setAttribute("entity",entity);
+
+
+ BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
+ PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
+ int ln = pds.length;
+ %>
+ <c:set var="entity" value="${entity}"/>
+ String view: ${entity}
+
+ <h4>Simple Properties</h4>
+ <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
+ <%
+ int i = 0;
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+
+ if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
+ out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
+
+ Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
+ if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
+ java.lang.reflect.Method idMethod = null;
+ try {
+ idMethod = reference.getClass().getMethod("getId", new Class[0]);
+ } catch (NoSuchMethodException nsme) { }
+ if (idMethod != null) {
+ try {
+ Object id = idMethod.invoke(reference,new Object[0]);
+ pageContext.setAttribute("child", reference);
+ String className = reference.getClass().getName();
+ if (className.indexOf('_') > 0) {
+ className = className.substring(0,className.indexOf('_'));
+ }
+ pageContext.setAttribute("cType", className);
+
+ %>
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a><br>
+ <%
+ } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+
+ out.println("</td></tr>");
+ }
+ }
+ %>
+ </table>
+
+
+ <%
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+ if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
+ out.println("<h4>" + pd.getName() + ": </h4><ul>");
+
+ Method readMethod = pd.getReadMethod();
+ if (readMethod != null) {
+ Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
+ for (Iterator iter = c.iterator(); iter.hasNext(); ) {
+ Object child = iter.next();
+ pageContext.setAttribute("child", child);
+ pageContext.setAttribute("cType", child.getClass().getName());
+ %>
+ <c:catch var="foo">
+ <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a>
+
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
+ <a href="${url}"><font color="red">x</font></a>
+
+ </li>
+ </c:catch>
+ <%
+ }
+ }
+ out.write("</ul>");
+ }
+ }
+ %>
+
+
+ </c:if>
+
+
+ <%!
+ public Object getConvertedKey(Class type, Object key) {
+ Class keyType = getKeyType(type);
+ System.out.println("Key type is: " + keyType);
+ PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
+ if (ed != null) {
+ ed.setAsText(String.valueOf(key));
+ return ed.getValue();
+ } else {
+ return key;
+ }
+ }
+
+ public Class getKeyType(Class type) {
+ Field[] fields = type.getDeclaredFields();
+ for (Field f : fields) {
+ Id id = f.getAnnotation(javax.persistence.Id.class);
+ if (id != null) {
+ return f.getType();
+ }
+ }
+
+ return Integer.class;
+ }
+
+ %>
+ </body>
+</html>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
index 86182ff..2b34f6f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
@@ -1,86 +1,86 @@
-/*==================================================
- * Geochrono Unit
- *==================================================
- */
-
-Timeline.GeochronoUnit = new Object();
-
-Timeline.GeochronoUnit.MA = 0;
-Timeline.GeochronoUnit.AGE = 1;
-Timeline.GeochronoUnit.EPOCH = 2;
-Timeline.GeochronoUnit.PERIOD = 3;
-Timeline.GeochronoUnit.ERA = 4;
-Timeline.GeochronoUnit.EON = 5;
-
-Timeline.GeochronoUnit.getParser = function(format) {
- return Timeline.GeochronoUnit.parseFromObject;
-};
-
-Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
- return new Timeline.GeochronoLabeller(locale);
-};
-
-Timeline.GeochronoUnit.wrapMA = function (n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.makeDefaultValue = function () {
- return Timeline.GeochronoUnit.wrapMA(0);
-};
-
-Timeline.GeochronoUnit.cloneValue = function (v) {
- return new Timeline.GeochronoUnit._MA(v._n);
-};
-
-Timeline.GeochronoUnit.parseFromObject = function(o) {
- if (o instanceof Timeline.GeochronoUnit._MA) {
- return o;
- } else if (typeof o == "number") {
- return Timeline.GeochronoUnit.wrapMA(o);
- } else if (typeof o == "string" && o.length > 0) {
- return Timeline.GeochronoUnit.wrapMA(Number(o));
- } else {
- return null;
- }
-};
-
-Timeline.GeochronoUnit.toNumber = function(v) {
- return v._n;
-};
-
-Timeline.GeochronoUnit.fromNumber = function(n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1._n;
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2._n;
- } else {
- n2 = Number(v2);
- }
-
- return n2 - n1;
-};
-
-Timeline.GeochronoUnit.earlier = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.later = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.change = function(v, n) {
- return new Timeline.GeochronoUnit._MA(v._n - n);
-};
-
-Timeline.GeochronoUnit._MA = function(n) {
- this._n = n;
-};
-
+/*==================================================
+ * Geochrono Unit
+ *==================================================
+ */
+
+Timeline.GeochronoUnit = new Object();
+
+Timeline.GeochronoUnit.MA = 0;
+Timeline.GeochronoUnit.AGE = 1;
+Timeline.GeochronoUnit.EPOCH = 2;
+Timeline.GeochronoUnit.PERIOD = 3;
+Timeline.GeochronoUnit.ERA = 4;
+Timeline.GeochronoUnit.EON = 5;
+
+Timeline.GeochronoUnit.getParser = function(format) {
+ return Timeline.GeochronoUnit.parseFromObject;
+};
+
+Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
+ return new Timeline.GeochronoLabeller(locale);
+};
+
+Timeline.GeochronoUnit.wrapMA = function (n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.makeDefaultValue = function () {
+ return Timeline.GeochronoUnit.wrapMA(0);
+};
+
+Timeline.GeochronoUnit.cloneValue = function (v) {
+ return new Timeline.GeochronoUnit._MA(v._n);
+};
+
+Timeline.GeochronoUnit.parseFromObject = function(o) {
+ if (o instanceof Timeline.GeochronoUnit._MA) {
+ return o;
+ } else if (typeof o == "number") {
+ return Timeline.GeochronoUnit.wrapMA(o);
+ } else if (typeof o == "string" && o.length > 0) {
+ return Timeline.GeochronoUnit.wrapMA(Number(o));
+ } else {
+ return null;
+ }
+};
+
+Timeline.GeochronoUnit.toNumber = function(v) {
+ return v._n;
+};
+
+Timeline.GeochronoUnit.fromNumber = function(n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1._n;
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2._n;
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n2 - n1;
+};
+
+Timeline.GeochronoUnit.earlier = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.later = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.change = function(v, n) {
+ return new Timeline.GeochronoUnit._MA(v._n - n);
+};
+
+Timeline.GeochronoUnit._MA = function(n) {
+ this._n = n;
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
index 92027ac..46a8adf 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
@@ -144,252 +144,252 @@ Timeline.JapaneseEraDateLabeller._eras = new Timeline.SortedArray(
return e1.startingYear - e2.startingYear;
},
[
- { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
- { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
- { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
- { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
- { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
- { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
- { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
- { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
- { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
- { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
- { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
- { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
- { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
- { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
- { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
- { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
- { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
- { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
- { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
- { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
- { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
- { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
- { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
- { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
- { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
- { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
- { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
- { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
- { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
- { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
- { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
- { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
- { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
- { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
- { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
- { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
- { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
- { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
- { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
- { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
- { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
- { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
- { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
- { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
- { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
- { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
- { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
- { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
- { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
- { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
- { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
- { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
- { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
- { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
- { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
- { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
- { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
- { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
- { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
- { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
- { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
- { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
- { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
- { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
- { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
- { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
- { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
- { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
- { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
- { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
- { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
- { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
- { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
- { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
- { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
- { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
- { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
- { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
- { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
- { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
- { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
- { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
- { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
- { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
- { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
- { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
- { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
- { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
- { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
- { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
- { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
- { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
- { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
- { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
- { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
- { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
- { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
- { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
- { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
- { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
- { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
- { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
- { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
- { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
- { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
- { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
- { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
- { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
- { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
- { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
- { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
- { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
- { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
- { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
- { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
- { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
- { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
- { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
- { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
- { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
- { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
- { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
- { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
- { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
- { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
- { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
- { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
- { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
- { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
- { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
- { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
- { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
- { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
- { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
- { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
- { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
- { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
- { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
- { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
- { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
- { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
- { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
- { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
- { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
- { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
- { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
- { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
- { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
- { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
- { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
- { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
- { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
- { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
- { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
- { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
- { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
- { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
- { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
- { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
- { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
- { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
- { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
- { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
- { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
- { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
- { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
- { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
- { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
- { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
- { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
- { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
- { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
- { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
- { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
- { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
- { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
- { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
- { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
- { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
- { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
- { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
- { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
- { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
- { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
- { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
- { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
- { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
- { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
- { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
- { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
- { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
- { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
- { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
- { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
- { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
- { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
- { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
- { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
- { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
- { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
- { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
- { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
- { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
- { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
- { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
- { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
- { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
- { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
- { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
- { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
- { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
- { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
- { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
- { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
- { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
- { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
- { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
- { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
- { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
- { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
- { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
- { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
- { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
- { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
- { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
- { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
- { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
- { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
- { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
- { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
- { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
- { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
- { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
- { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
- { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
- { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
- { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
- { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
- { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
- { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
- { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
- { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
- { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
- { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
- { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
- { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
- { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
+ { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
+ { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
+ { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
+ { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
+ { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
+ { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
+ { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
+ { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
+ { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
+ { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
+ { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
+ { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
+ { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
+ { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
+ { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
+ { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
+ { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
+ { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
+ { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
+ { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
+ { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
+ { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
+ { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
+ { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
+ { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
+ { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
+ { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
+ { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
+ { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
+ { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
+ { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
+ { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
+ { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
+ { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
+ { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
+ { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
+ { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
+ { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
+ { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
+ { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
+ { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
+ { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
+ { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
+ { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
+ { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
+ { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
+ { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
+ { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
+ { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
+ { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
+ { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
+ { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
+ { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
+ { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
+ { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
+ { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
+ { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
+ { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
+ { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
+ { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
+ { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
+ { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
+ { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
+ { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
+ { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
+ { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
+ { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
+ { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
+ { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
+ { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
+ { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
+ { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
+ { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
+ { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
+ { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
+ { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
+ { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
+ { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
+ { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
+ { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
+ { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
+ { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
+ { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
+ { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
+ { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
+ { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
+ { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
+ { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
+ { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
+ { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
+ { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
+ { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
+ { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
+ { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
+ { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
+ { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
+ { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
+ { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
+ { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
+ { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
+ { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
+ { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
+ { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
+ { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
+ { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
+ { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
+ { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
+ { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
+ { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
+ { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
+ { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
+ { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
+ { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
+ { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
+ { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
+ { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
+ { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
+ { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
+ { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
+ { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
+ { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
+ { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
+ { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
+ { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
+ { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
+ { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
+ { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
+ { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
+ { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
+ { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
+ { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
+ { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
+ { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
+ { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
+ { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
+ { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
+ { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
+ { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
+ { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
+ { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
+ { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
+ { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
+ { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
+ { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
+ { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
+ { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
+ { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
+ { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
+ { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
+ { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
+ { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
+ { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
+ { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
+ { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
+ { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
+ { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
+ { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
+ { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
+ { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
+ { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
+ { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
+ { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
+ { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
+ { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
+ { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
+ { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
+ { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
+ { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
+ { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
+ { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
+ { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
+ { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
+ { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
+ { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
+ { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
+ { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
+ { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
+ { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
+ { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
+ { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
+ { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
+ { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
+ { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
+ { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
+ { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
+ { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
+ { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
+ { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
+ { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
+ { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
+ { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
+ { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
+ { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
+ { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
+ { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
+ { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
+ { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
+ { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
+ { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
+ { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
+ { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
+ { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
+ { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
+ { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
+ { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
+ { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
+ { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
+ { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
+ { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
+ { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
+ { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
+ { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
+ { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
+ { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
+ { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
+ { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
+ { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
+ { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
+ { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
+ { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
+ { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
+ { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
+ { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
+ { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
+ { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
+ { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
+ { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
+ { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
+ { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
+ { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
+ { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
+ { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
+ { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
+ { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
+ { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
+ { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
+ { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
+ { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
+ { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
+ { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
+ { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
+ { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
+ { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
+ { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
+ { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
]
);
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
index 954c7a8..caef889 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
@@ -1,30 +1,30 @@
-/*==================================================
- * Localization of labellers.js
- *==================================================
- */
-
-Timeline.GregorianDateLabeller.monthNames["cs"] = [
- "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
-];
-
-Timeline.GregorianDateLabeller.dayNames["cs"] = [
- "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
-];
-
-Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
- var text;
- var emphasized = false;
-
- var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
-
- switch(intervalUnit) {
- case Timeline.DateTime.DAY:
- case Timeline.DateTime.WEEK:
- text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
- break;
- default:
- return this.defaultLabelInterval(date, intervalUnit);
- }
-
- return { text: text, emphasized: emphasized };
-};
+/*==================================================
+ * Localization of labellers.js
+ *==================================================
+ */
+
+Timeline.GregorianDateLabeller.monthNames["cs"] = [
+ "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
+];
+
+Timeline.GregorianDateLabeller.dayNames["cs"] = [
+ "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
+];
+
+Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
+ var text;
+ var emphasized = false;
+
+ var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
+
+ switch(intervalUnit) {
+ case Timeline.DateTime.DAY:
+ case Timeline.DateTime.WEEK:
+ text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
+ break;
+ default:
+ return this.defaultLabelInterval(date, intervalUnit);
+ }
+
+ return { text: text, emphasized: emphasized };
+};
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
index d823a51..21d41a4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
@@ -1,9 +1,9 @@
-/*==================================================
- * Common localization strings
- *==================================================
- */
-
-Timeline.strings["cs"] = {
- wikiLinkLabel: "Diskuze"
-};
-
+/*==================================================
+ * Common localization strings
+ *==================================================
+ */
+
+Timeline.strings["cs"] = {
+ wikiLinkLabel: "Diskuze"
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
index 378cda1..f4ec6ae 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
@@ -3,10 +3,10 @@
*==================================================
*/
-Timeline.GregorianDateLabeller.monthNames["se"] = [
- "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
+Timeline.GregorianDateLabeller.monthNames["se"] = [
+ "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
];
-Timeline.GregorianDateLabeller.dayNames["se"] = [
- "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
+Timeline.GregorianDateLabeller.dayNames["se"] = [
+ "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
];
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
index 15ea379..00a3ff1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
@@ -1,14 +1,14 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
Timeline.NativeDateUnit = new Object();
Timeline.NativeDateUnit.createLabeller = function(locale, timeZone) {
return new Timeline.GregorianDateLabeller(locale, timeZone);
};
-
+
Timeline.NativeDateUnit.makeDefaultValue = function() {
return new Date();
};
@@ -21,15 +21,15 @@ Timeline.NativeDateUnit.getParser = function(format) {
if (typeof format == "string") {
format = format.toLowerCase();
}
- return (format == "iso8601" || format == "iso 8601") ?
- Timeline.DateTime.parseIso8601DateTime :
- Timeline.DateTime.parseGregorianDateTime;
+ return (format == "iso8601" || format == "iso 8601") ?
+ Timeline.DateTime.parseIso8601DateTime :
+ Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject = function(o) {
return Timeline.DateTime.parseGregorianDateTime(o);
};
-
+
Timeline.NativeDateUnit.toNumber = function(v) {
return v.getTime();
};
diff --git a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
index 2cde42e..87dacfe 100644
--- a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
+++ b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
@@ -1,145 +1,145 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2006, JBoss Inc. All rights reserved.
- */
-
-package org.rhq.plugins.hibernate.test;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.discovery.InventoryReport;
-import org.rhq.core.domain.measurement.MeasurementData;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementReport;
-import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.pluginapi.inventory.ResourceComponent;
-import org.rhq.core.pluginapi.measurement.MeasurementFacet;
-import org.rhq.core.pc.PluginContainer;
-import org.rhq.core.pc.PluginContainerConfiguration;
-import org.rhq.core.pc.plugin.FileSystemPluginFinder;
-import org.rhq.core.pc.plugin.PluginEnvironment;
-import org.rhq.core.pc.plugin.PluginManager;
-
-/**
- * @author Greg Hinkle
- */
-@Test(groups = "hibernate-plugin")
-public class HibernatePluginTest
-{
- private Log log = LogFactory.getLog(HibernatePluginTest.class);
- private static final String PLUGIN_NAME = "Hibernate";
-
- @BeforeSuite
- public void start()
- {
- try
- {
- File pluginDir = new File("target/itest/plugins");
- PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
- pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
- pcConfig.setPluginDirectory(pluginDir);
-
- pcConfig.setInsideAgent(false);
- PluginContainer.getInstance().setConfiguration(pcConfig);
- PluginContainer.getInstance().initialize();
- log.info("PC started.");
- for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
- log.info("...Loaded plugin: " + plugin);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
- @AfterSuite
- public void stop()
- {
- PluginContainer.getInstance().shutdown();
- }
-
- @Test
- public void testPluginLoad()
- {
- PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
- PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
- assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
- assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
- }
-
- @Test(dependsOnMethods = "testPluginLoad")
- public void testDiscovery() throws Exception
- {
- InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
- System.out.println("Found " + resources.size() + " hibernate services");
- }
-
- @Test(dependsOnMethods = "testDiscovery")
- public void testMeasurement() throws Exception
- {
- for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
- {
- testResourceMeasurement(server);
- }
- }
-
- private Set<Resource> findResource(Resource parent, String typeName)
- {
- Set<Resource> found = new HashSet<Resource>();
- @SuppressWarnings({"UnnecessaryLocalVariable"})
- Resource platform = parent;
- for (Resource resource : platform.getChildResources())
- {
- if (resource.getResourceType().getName().equals(typeName))
- {
- found.add(resource);
- }
- if (resource.getChildResources() != null)
- {
- for (Resource child : found)
- {
- found.addAll(findResource(child,typeName));
- }
- }
- }
- return found;
- }
-
- private void testResourceMeasurement(Resource resource)throws Exception
- {
- ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
- if (resourceComponent instanceof MeasurementFacet)
- {
- for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
- {
- Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
- metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
- MeasurementReport report = new MeasurementReport();
- ((MeasurementFacet) resourceComponent).getValues(report, metricList);
-
- assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
- MeasurementData data = report.getNumericData().iterator().next();
- assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
- System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
- }
- }
- }
-}
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc. All rights reserved.
+ */
+
+package org.rhq.plugins.hibernate.test;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.discovery.InventoryReport;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.plugin.FileSystemPluginFinder;
+import org.rhq.core.pc.plugin.PluginEnvironment;
+import org.rhq.core.pc.plugin.PluginManager;
+
+/**
+ * @author Greg Hinkle
+ */
+@Test(groups = "hibernate-plugin")
+public class HibernatePluginTest
+{
+ private Log log = LogFactory.getLog(HibernatePluginTest.class);
+ private static final String PLUGIN_NAME = "Hibernate";
+
+ @BeforeSuite
+ public void start()
+ {
+ try
+ {
+ File pluginDir = new File("target/itest/plugins");
+ PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
+ pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
+ pcConfig.setPluginDirectory(pluginDir);
+
+ pcConfig.setInsideAgent(false);
+ PluginContainer.getInstance().setConfiguration(pcConfig);
+ PluginContainer.getInstance().initialize();
+ log.info("PC started.");
+ for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
+ log.info("...Loaded plugin: " + plugin);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterSuite
+ public void stop()
+ {
+ PluginContainer.getInstance().shutdown();
+ }
+
+ @Test
+ public void testPluginLoad()
+ {
+ PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
+ PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
+ assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
+ assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
+ }
+
+ @Test(dependsOnMethods = "testPluginLoad")
+ public void testDiscovery() throws Exception
+ {
+ InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
+ System.out.println("Found " + resources.size() + " hibernate services");
+ }
+
+ @Test(dependsOnMethods = "testDiscovery")
+ public void testMeasurement() throws Exception
+ {
+ for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
+ {
+ testResourceMeasurement(server);
+ }
+ }
+
+ private Set<Resource> findResource(Resource parent, String typeName)
+ {
+ Set<Resource> found = new HashSet<Resource>();
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ Resource platform = parent;
+ for (Resource resource : platform.getChildResources())
+ {
+ if (resource.getResourceType().getName().equals(typeName))
+ {
+ found.add(resource);
+ }
+ if (resource.getChildResources() != null)
+ {
+ for (Resource child : found)
+ {
+ found.addAll(findResource(child,typeName));
+ }
+ }
+ }
+ return found;
+ }
+
+ private void testResourceMeasurement(Resource resource)throws Exception
+ {
+ ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
+ if (resourceComponent instanceof MeasurementFacet)
+ {
+ for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
+ {
+ Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
+ metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
+ MeasurementReport report = new MeasurementReport();
+ ((MeasurementFacet) resourceComponent).getValues(report, metricList);
+
+ assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
+ MeasurementData data = report.getNumericData().iterator().next();
+ assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
+ System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
+ }
+ }
+ }
+}
commit 88053978455182c491a0114bc45eee3c055b00f6
Merge: bd52cc5... c2a8935...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:29:42 2010 -0400
Merge branch 'bundle' into master-jay
commit bd52cc56a19ef9ee613ef35a3bb3be332b107d15
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:29:32 2010 -0400
LF commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
index 6d6be4a..ae79536 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
@@ -1,253 +1,253 @@
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
-<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
-<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
-<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
-<%@ page import="javax.naming.InitialContext" %>
-<%@ page import="javax.persistence.EntityManager" %>
-<%@ page import="javax.persistence.EntityManagerFactory" %>
-<%@ page import="javax.persistence.Id" %>
-<%@ page import="java.beans.BeanInfo" %>
-<%@ page import="java.beans.Introspector" %>
-<%@ page import="java.beans.PropertyDescriptor" %>
-<%@ page import="java.beans.PropertyEditor" %>
-<%@ page import="java.beans.PropertyEditorManager" %>
-<%@ page import="java.lang.reflect.Field" %>
-<%@ page import="java.lang.reflect.Method" %>
-<%@ page import="java.util.Collection" %>
-<%@ page import="java.util.Iterator" %>
-<%@ page import="java.util.List" %>
-<%@ page import="java.util.Map" %>
-<%@ page import="java.util.SortedSet" %>
-<%@ page import="java.util.TreeSet" %>
-<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>EJB3 Entity browser</title>
- </head>
- <body>
-
- <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
-
- <h1>Entity browser</h1>
- ${param.entityClass}
-
- <c:if test="${param.pEntity != null}">
- <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
- <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
- </c:if>
-
- <%
- InitialContext ic = new InitialContext();
-
- EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
- EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
- .createEntityManager();
-
-
- org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
- SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
-
- %>
-
-
- <c:if test="${param.entityClass == null}">
- <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
-
- <%
-
- Map<String, Object> metadata = sfi.getAllClassMetadata();
- SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
-
- %>
-
- <ul>
-
- <%
- for (String className : classes) {
- Object val = metadata.get(className);
- String url = "browser.jsp?entityClass=" + className;
-
- className = className.replaceFirst(".*\\.(.*\\..*)","$1");
-
- out.println(
- " <li><a href=\"" + url + "\">" + className +"</a></li>");
- }
- %>
-
-
- </ul>
- </c:if>
-
-
- <c:if test="${param.entityClass != null}">
- <c:set var="entityClass" value="${param.entityClass}"/>
- </c:if>
-
- <c:if test="${param.mode == 'delete'}">
- <%
- String entityName = (String)pageContext.getRequest().getParameter("entityClass");
- String key = (String)pageContext.getRequest().getParameter("key");
-
- em.remove(em.find(Class.forName(entityName),key));
- entityName = (String) pageContext.getRequest().getParameter("pEntity");
- key = (String) pageContext.getRequest().getParameter("pKey");
- ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
- "browser.jsp?entityClass=" + entityName + "&key=" + key);
- if (true)
- return;
- %></c:if>
-
-
- <c:if test="${param.key == null}">
- <h3>Listing ${entityClass}</h3>
- <%
- String entityName = (String)pageContext.findAttribute("entityClass");
- entityName = entityName.substring(entityName.lastIndexOf('.')+1);
- List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
-
- pageContext.setAttribute("values", values);%>
- <c:forEach var="entity" items="${values}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
- <a href="${url}">${entity}</a><br>
- </c:forEach>
-
- </c:if>
-
- <c:if test="${param.key != null}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
- <h3>Details of ${entityClass} (${param.key})</h3>
- <a href="${url}">List all ${entityClass}</a><br>
- <%
- Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
- Object entity = em.find(entityType,
- getConvertedKey(entityType,
- pageContext.getRequest().getParameter("key")));
- pageContext.setAttribute("entity",entity);
-
-
- BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
- PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
- int ln = pds.length;
- %>
- <c:set var="entity" value="${entity}"/>
- String view: ${entity}
-
- <h4>Simple Properties</h4>
- <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
- <%
- int i = 0;
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
-
- if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
- out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
-
- Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
- if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
- java.lang.reflect.Method idMethod = null;
- try {
- idMethod = reference.getClass().getMethod("getId", new Class[0]);
- } catch (NoSuchMethodException nsme) { }
- if (idMethod != null) {
- try {
- Object id = idMethod.invoke(reference,new Object[0]);
- pageContext.setAttribute("child", reference);
- String className = reference.getClass().getName();
- if (className.indexOf('_') > 0) {
- className = className.substring(0,className.indexOf('_'));
- }
- pageContext.setAttribute("cType", className);
-
- %>
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a><br>
- <%
- } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
-
- out.println("</td></tr>");
- }
- }
- %>
- </table>
-
-
- <%
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
- if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
- out.println("<h4>" + pd.getName() + ": </h4><ul>");
-
- Method readMethod = pd.getReadMethod();
- if (readMethod != null) {
- Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
- for (Iterator iter = c.iterator(); iter.hasNext(); ) {
- Object child = iter.next();
- pageContext.setAttribute("child", child);
- pageContext.setAttribute("cType", child.getClass().getName());
- %>
- <c:catch var="foo">
- <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a>
-
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
- <a href="${url}"><font color="red">x</font></a>
-
- </li>
- </c:catch>
- <%
- }
- }
- out.write("</ul>");
- }
- }
- %>
-
-
- </c:if>
-
-
- <%!
- public Object getConvertedKey(Class type, Object key) {
- Class keyType = getKeyType(type);
- System.out.println("Key type is: " + keyType);
- PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
- if (ed != null) {
- ed.setAsText(String.valueOf(key));
- return ed.getValue();
- } else {
- return key;
- }
- }
-
- public Class getKeyType(Class type) {
- Field[] fields = type.getDeclaredFields();
- for (Field f : fields) {
- Id id = f.getAnnotation(javax.persistence.Id.class);
- if (id != null) {
- return f.getType();
- }
- }
-
- return Integer.class;
- }
-
- %>
- </body>
-</html>
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
+<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
+<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
+<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
+<%@ page import="javax.naming.InitialContext" %>
+<%@ page import="javax.persistence.EntityManager" %>
+<%@ page import="javax.persistence.EntityManagerFactory" %>
+<%@ page import="javax.persistence.Id" %>
+<%@ page import="java.beans.BeanInfo" %>
+<%@ page import="java.beans.Introspector" %>
+<%@ page import="java.beans.PropertyDescriptor" %>
+<%@ page import="java.beans.PropertyEditor" %>
+<%@ page import="java.beans.PropertyEditorManager" %>
+<%@ page import="java.lang.reflect.Field" %>
+<%@ page import="java.lang.reflect.Method" %>
+<%@ page import="java.util.Collection" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.Map" %>
+<%@ page import="java.util.SortedSet" %>
+<%@ page import="java.util.TreeSet" %>
+<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>EJB3 Entity browser</title>
+ </head>
+ <body>
+
+ <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
+
+ <h1>Entity browser</h1>
+ ${param.entityClass}
+
+ <c:if test="${param.pEntity != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
+ <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
+ </c:if>
+
+ <%
+ InitialContext ic = new InitialContext();
+
+ EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
+ EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
+ .createEntityManager();
+
+
+ org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
+ SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
+
+ %>
+
+
+ <c:if test="${param.entityClass == null}">
+ <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
+
+ <%
+
+ Map<String, Object> metadata = sfi.getAllClassMetadata();
+ SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
+
+ %>
+
+ <ul>
+
+ <%
+ for (String className : classes) {
+ Object val = metadata.get(className);
+ String url = "browser.jsp?entityClass=" + className;
+
+ className = className.replaceFirst(".*\\.(.*\\..*)","$1");
+
+ out.println(
+ " <li><a href=\"" + url + "\">" + className +"</a></li>");
+ }
+ %>
+
+
+ </ul>
+ </c:if>
+
+
+ <c:if test="${param.entityClass != null}">
+ <c:set var="entityClass" value="${param.entityClass}"/>
+ </c:if>
+
+ <c:if test="${param.mode == 'delete'}">
+ <%
+ String entityName = (String)pageContext.getRequest().getParameter("entityClass");
+ String key = (String)pageContext.getRequest().getParameter("key");
+
+ em.remove(em.find(Class.forName(entityName),key));
+ entityName = (String) pageContext.getRequest().getParameter("pEntity");
+ key = (String) pageContext.getRequest().getParameter("pKey");
+ ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
+ "browser.jsp?entityClass=" + entityName + "&key=" + key);
+ if (true)
+ return;
+ %></c:if>
+
+
+ <c:if test="${param.key == null}">
+ <h3>Listing ${entityClass}</h3>
+ <%
+ String entityName = (String)pageContext.findAttribute("entityClass");
+ entityName = entityName.substring(entityName.lastIndexOf('.')+1);
+ List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
+
+ pageContext.setAttribute("values", values);%>
+ <c:forEach var="entity" items="${values}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
+ <a href="${url}">${entity}</a><br>
+ </c:forEach>
+
+ </c:if>
+
+ <c:if test="${param.key != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
+ <h3>Details of ${entityClass} (${param.key})</h3>
+ <a href="${url}">List all ${entityClass}</a><br>
+ <%
+ Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
+ Object entity = em.find(entityType,
+ getConvertedKey(entityType,
+ pageContext.getRequest().getParameter("key")));
+ pageContext.setAttribute("entity",entity);
+
+
+ BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
+ PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
+ int ln = pds.length;
+ %>
+ <c:set var="entity" value="${entity}"/>
+ String view: ${entity}
+
+ <h4>Simple Properties</h4>
+ <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
+ <%
+ int i = 0;
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+
+ if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
+ out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
+
+ Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
+ if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
+ java.lang.reflect.Method idMethod = null;
+ try {
+ idMethod = reference.getClass().getMethod("getId", new Class[0]);
+ } catch (NoSuchMethodException nsme) { }
+ if (idMethod != null) {
+ try {
+ Object id = idMethod.invoke(reference,new Object[0]);
+ pageContext.setAttribute("child", reference);
+ String className = reference.getClass().getName();
+ if (className.indexOf('_') > 0) {
+ className = className.substring(0,className.indexOf('_'));
+ }
+ pageContext.setAttribute("cType", className);
+
+ %>
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a><br>
+ <%
+ } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+
+ out.println("</td></tr>");
+ }
+ }
+ %>
+ </table>
+
+
+ <%
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+ if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
+ out.println("<h4>" + pd.getName() + ": </h4><ul>");
+
+ Method readMethod = pd.getReadMethod();
+ if (readMethod != null) {
+ Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
+ for (Iterator iter = c.iterator(); iter.hasNext(); ) {
+ Object child = iter.next();
+ pageContext.setAttribute("child", child);
+ pageContext.setAttribute("cType", child.getClass().getName());
+ %>
+ <c:catch var="foo">
+ <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a>
+
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
+ <a href="${url}"><font color="red">x</font></a>
+
+ </li>
+ </c:catch>
+ <%
+ }
+ }
+ out.write("</ul>");
+ }
+ }
+ %>
+
+
+ </c:if>
+
+
+ <%!
+ public Object getConvertedKey(Class type, Object key) {
+ Class keyType = getKeyType(type);
+ System.out.println("Key type is: " + keyType);
+ PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
+ if (ed != null) {
+ ed.setAsText(String.valueOf(key));
+ return ed.getValue();
+ } else {
+ return key;
+ }
+ }
+
+ public Class getKeyType(Class type) {
+ Field[] fields = type.getDeclaredFields();
+ for (Field f : fields) {
+ Id id = f.getAnnotation(javax.persistence.Id.class);
+ if (id != null) {
+ return f.getType();
+ }
+ }
+
+ return Integer.class;
+ }
+
+ %>
+ </body>
+</html>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
index 86182ff..2b34f6f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
@@ -1,86 +1,86 @@
-/*==================================================
- * Geochrono Unit
- *==================================================
- */
-
-Timeline.GeochronoUnit = new Object();
-
-Timeline.GeochronoUnit.MA = 0;
-Timeline.GeochronoUnit.AGE = 1;
-Timeline.GeochronoUnit.EPOCH = 2;
-Timeline.GeochronoUnit.PERIOD = 3;
-Timeline.GeochronoUnit.ERA = 4;
-Timeline.GeochronoUnit.EON = 5;
-
-Timeline.GeochronoUnit.getParser = function(format) {
- return Timeline.GeochronoUnit.parseFromObject;
-};
-
-Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
- return new Timeline.GeochronoLabeller(locale);
-};
-
-Timeline.GeochronoUnit.wrapMA = function (n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.makeDefaultValue = function () {
- return Timeline.GeochronoUnit.wrapMA(0);
-};
-
-Timeline.GeochronoUnit.cloneValue = function (v) {
- return new Timeline.GeochronoUnit._MA(v._n);
-};
-
-Timeline.GeochronoUnit.parseFromObject = function(o) {
- if (o instanceof Timeline.GeochronoUnit._MA) {
- return o;
- } else if (typeof o == "number") {
- return Timeline.GeochronoUnit.wrapMA(o);
- } else if (typeof o == "string" && o.length > 0) {
- return Timeline.GeochronoUnit.wrapMA(Number(o));
- } else {
- return null;
- }
-};
-
-Timeline.GeochronoUnit.toNumber = function(v) {
- return v._n;
-};
-
-Timeline.GeochronoUnit.fromNumber = function(n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1._n;
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2._n;
- } else {
- n2 = Number(v2);
- }
-
- return n2 - n1;
-};
-
-Timeline.GeochronoUnit.earlier = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.later = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.change = function(v, n) {
- return new Timeline.GeochronoUnit._MA(v._n - n);
-};
-
-Timeline.GeochronoUnit._MA = function(n) {
- this._n = n;
-};
-
+/*==================================================
+ * Geochrono Unit
+ *==================================================
+ */
+
+Timeline.GeochronoUnit = new Object();
+
+Timeline.GeochronoUnit.MA = 0;
+Timeline.GeochronoUnit.AGE = 1;
+Timeline.GeochronoUnit.EPOCH = 2;
+Timeline.GeochronoUnit.PERIOD = 3;
+Timeline.GeochronoUnit.ERA = 4;
+Timeline.GeochronoUnit.EON = 5;
+
+Timeline.GeochronoUnit.getParser = function(format) {
+ return Timeline.GeochronoUnit.parseFromObject;
+};
+
+Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
+ return new Timeline.GeochronoLabeller(locale);
+};
+
+Timeline.GeochronoUnit.wrapMA = function (n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.makeDefaultValue = function () {
+ return Timeline.GeochronoUnit.wrapMA(0);
+};
+
+Timeline.GeochronoUnit.cloneValue = function (v) {
+ return new Timeline.GeochronoUnit._MA(v._n);
+};
+
+Timeline.GeochronoUnit.parseFromObject = function(o) {
+ if (o instanceof Timeline.GeochronoUnit._MA) {
+ return o;
+ } else if (typeof o == "number") {
+ return Timeline.GeochronoUnit.wrapMA(o);
+ } else if (typeof o == "string" && o.length > 0) {
+ return Timeline.GeochronoUnit.wrapMA(Number(o));
+ } else {
+ return null;
+ }
+};
+
+Timeline.GeochronoUnit.toNumber = function(v) {
+ return v._n;
+};
+
+Timeline.GeochronoUnit.fromNumber = function(n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1._n;
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2._n;
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n2 - n1;
+};
+
+Timeline.GeochronoUnit.earlier = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.later = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.change = function(v, n) {
+ return new Timeline.GeochronoUnit._MA(v._n - n);
+};
+
+Timeline.GeochronoUnit._MA = function(n) {
+ this._n = n;
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
index 92027ac..46a8adf 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
@@ -144,252 +144,252 @@ Timeline.JapaneseEraDateLabeller._eras = new Timeline.SortedArray(
return e1.startingYear - e2.startingYear;
},
[
- { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
- { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
- { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
- { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
- { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
- { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
- { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
- { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
- { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
- { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
- { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
- { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
- { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
- { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
- { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
- { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
- { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
- { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
- { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
- { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
- { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
- { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
- { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
- { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
- { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
- { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
- { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
- { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
- { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
- { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
- { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
- { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
- { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
- { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
- { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
- { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
- { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
- { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
- { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
- { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
- { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
- { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
- { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
- { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
- { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
- { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
- { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
- { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
- { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
- { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
- { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
- { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
- { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
- { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
- { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
- { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
- { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
- { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
- { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
- { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
- { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
- { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
- { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
- { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
- { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
- { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
- { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
- { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
- { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
- { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
- { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
- { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
- { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
- { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
- { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
- { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
- { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
- { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
- { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
- { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
- { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
- { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
- { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
- { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
- { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
- { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
- { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
- { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
- { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
- { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
- { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
- { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
- { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
- { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
- { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
- { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
- { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
- { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
- { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
- { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
- { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
- { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
- { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
- { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
- { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
- { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
- { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
- { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
- { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
- { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
- { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
- { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
- { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
- { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
- { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
- { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
- { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
- { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
- { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
- { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
- { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
- { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
- { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
- { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
- { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
- { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
- { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
- { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
- { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
- { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
- { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
- { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
- { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
- { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
- { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
- { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
- { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
- { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
- { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
- { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
- { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
- { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
- { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
- { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
- { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
- { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
- { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
- { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
- { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
- { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
- { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
- { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
- { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
- { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
- { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
- { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
- { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
- { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
- { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
- { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
- { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
- { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
- { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
- { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
- { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
- { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
- { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
- { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
- { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
- { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
- { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
- { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
- { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
- { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
- { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
- { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
- { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
- { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
- { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
- { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
- { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
- { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
- { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
- { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
- { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
- { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
- { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
- { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
- { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
- { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
- { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
- { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
- { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
- { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
- { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
- { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
- { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
- { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
- { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
- { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
- { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
- { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
- { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
- { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
- { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
- { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
- { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
- { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
- { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
- { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
- { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
- { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
- { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
- { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
- { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
- { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
- { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
- { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
- { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
- { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
- { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
- { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
- { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
- { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
- { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
- { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
- { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
- { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
- { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
- { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
- { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
- { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
- { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
- { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
- { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
- { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
- { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
- { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
- { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
- { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
- { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
- { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
- { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
- { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
- { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
- { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
- { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
+ { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
+ { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
+ { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
+ { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
+ { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
+ { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
+ { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
+ { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
+ { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
+ { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
+ { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
+ { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
+ { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
+ { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
+ { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
+ { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
+ { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
+ { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
+ { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
+ { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
+ { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
+ { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
+ { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
+ { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
+ { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
+ { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
+ { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
+ { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
+ { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
+ { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
+ { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
+ { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
+ { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
+ { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
+ { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
+ { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
+ { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
+ { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
+ { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
+ { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
+ { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
+ { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
+ { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
+ { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
+ { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
+ { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
+ { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
+ { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
+ { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
+ { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
+ { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
+ { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
+ { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
+ { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
+ { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
+ { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
+ { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
+ { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
+ { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
+ { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
+ { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
+ { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
+ { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
+ { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
+ { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
+ { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
+ { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
+ { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
+ { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
+ { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
+ { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
+ { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
+ { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
+ { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
+ { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
+ { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
+ { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
+ { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
+ { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
+ { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
+ { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
+ { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
+ { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
+ { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
+ { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
+ { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
+ { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
+ { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
+ { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
+ { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
+ { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
+ { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
+ { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
+ { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
+ { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
+ { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
+ { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
+ { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
+ { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
+ { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
+ { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
+ { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
+ { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
+ { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
+ { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
+ { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
+ { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
+ { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
+ { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
+ { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
+ { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
+ { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
+ { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
+ { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
+ { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
+ { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
+ { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
+ { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
+ { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
+ { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
+ { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
+ { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
+ { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
+ { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
+ { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
+ { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
+ { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
+ { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
+ { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
+ { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
+ { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
+ { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
+ { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
+ { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
+ { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
+ { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
+ { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
+ { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
+ { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
+ { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
+ { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
+ { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
+ { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
+ { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
+ { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
+ { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
+ { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
+ { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
+ { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
+ { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
+ { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
+ { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
+ { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
+ { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
+ { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
+ { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
+ { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
+ { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
+ { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
+ { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
+ { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
+ { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
+ { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
+ { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
+ { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
+ { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
+ { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
+ { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
+ { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
+ { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
+ { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
+ { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
+ { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
+ { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
+ { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
+ { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
+ { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
+ { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
+ { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
+ { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
+ { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
+ { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
+ { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
+ { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
+ { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
+ { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
+ { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
+ { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
+ { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
+ { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
+ { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
+ { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
+ { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
+ { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
+ { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
+ { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
+ { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
+ { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
+ { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
+ { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
+ { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
+ { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
+ { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
+ { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
+ { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
+ { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
+ { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
+ { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
+ { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
+ { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
+ { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
+ { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
+ { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
+ { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
+ { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
+ { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
+ { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
+ { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
+ { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
+ { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
+ { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
+ { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
+ { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
+ { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
+ { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
+ { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
+ { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
+ { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
+ { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
+ { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
+ { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
+ { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
+ { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
+ { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
+ { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
+ { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
+ { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
+ { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
+ { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
+ { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
+ { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
+ { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
+ { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
+ { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
+ { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
]
);
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
index 954c7a8..caef889 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
@@ -1,30 +1,30 @@
-/*==================================================
- * Localization of labellers.js
- *==================================================
- */
-
-Timeline.GregorianDateLabeller.monthNames["cs"] = [
- "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
-];
-
-Timeline.GregorianDateLabeller.dayNames["cs"] = [
- "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
-];
-
-Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
- var text;
- var emphasized = false;
-
- var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
-
- switch(intervalUnit) {
- case Timeline.DateTime.DAY:
- case Timeline.DateTime.WEEK:
- text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
- break;
- default:
- return this.defaultLabelInterval(date, intervalUnit);
- }
-
- return { text: text, emphasized: emphasized };
-};
+/*==================================================
+ * Localization of labellers.js
+ *==================================================
+ */
+
+Timeline.GregorianDateLabeller.monthNames["cs"] = [
+ "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
+];
+
+Timeline.GregorianDateLabeller.dayNames["cs"] = [
+ "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
+];
+
+Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
+ var text;
+ var emphasized = false;
+
+ var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
+
+ switch(intervalUnit) {
+ case Timeline.DateTime.DAY:
+ case Timeline.DateTime.WEEK:
+ text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
+ break;
+ default:
+ return this.defaultLabelInterval(date, intervalUnit);
+ }
+
+ return { text: text, emphasized: emphasized };
+};
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
index d823a51..21d41a4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
@@ -1,9 +1,9 @@
-/*==================================================
- * Common localization strings
- *==================================================
- */
-
-Timeline.strings["cs"] = {
- wikiLinkLabel: "Diskuze"
-};
-
+/*==================================================
+ * Common localization strings
+ *==================================================
+ */
+
+Timeline.strings["cs"] = {
+ wikiLinkLabel: "Diskuze"
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
index 378cda1..f4ec6ae 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
@@ -3,10 +3,10 @@
*==================================================
*/
-Timeline.GregorianDateLabeller.monthNames["se"] = [
- "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
+Timeline.GregorianDateLabeller.monthNames["se"] = [
+ "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
];
-Timeline.GregorianDateLabeller.dayNames["se"] = [
- "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
+Timeline.GregorianDateLabeller.dayNames["se"] = [
+ "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
];
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
index 15ea379..00a3ff1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
@@ -1,14 +1,14 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
Timeline.NativeDateUnit = new Object();
Timeline.NativeDateUnit.createLabeller = function(locale, timeZone) {
return new Timeline.GregorianDateLabeller(locale, timeZone);
};
-
+
Timeline.NativeDateUnit.makeDefaultValue = function() {
return new Date();
};
@@ -21,15 +21,15 @@ Timeline.NativeDateUnit.getParser = function(format) {
if (typeof format == "string") {
format = format.toLowerCase();
}
- return (format == "iso8601" || format == "iso 8601") ?
- Timeline.DateTime.parseIso8601DateTime :
- Timeline.DateTime.parseGregorianDateTime;
+ return (format == "iso8601" || format == "iso 8601") ?
+ Timeline.DateTime.parseIso8601DateTime :
+ Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject = function(o) {
return Timeline.DateTime.parseGregorianDateTime(o);
};
-
+
Timeline.NativeDateUnit.toNumber = function(v) {
return v.getTime();
};
diff --git a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
index 2cde42e..87dacfe 100644
--- a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
+++ b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
@@ -1,145 +1,145 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2006, JBoss Inc. All rights reserved.
- */
-
-package org.rhq.plugins.hibernate.test;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.discovery.InventoryReport;
-import org.rhq.core.domain.measurement.MeasurementData;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementReport;
-import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.pluginapi.inventory.ResourceComponent;
-import org.rhq.core.pluginapi.measurement.MeasurementFacet;
-import org.rhq.core.pc.PluginContainer;
-import org.rhq.core.pc.PluginContainerConfiguration;
-import org.rhq.core.pc.plugin.FileSystemPluginFinder;
-import org.rhq.core.pc.plugin.PluginEnvironment;
-import org.rhq.core.pc.plugin.PluginManager;
-
-/**
- * @author Greg Hinkle
- */
-@Test(groups = "hibernate-plugin")
-public class HibernatePluginTest
-{
- private Log log = LogFactory.getLog(HibernatePluginTest.class);
- private static final String PLUGIN_NAME = "Hibernate";
-
- @BeforeSuite
- public void start()
- {
- try
- {
- File pluginDir = new File("target/itest/plugins");
- PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
- pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
- pcConfig.setPluginDirectory(pluginDir);
-
- pcConfig.setInsideAgent(false);
- PluginContainer.getInstance().setConfiguration(pcConfig);
- PluginContainer.getInstance().initialize();
- log.info("PC started.");
- for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
- log.info("...Loaded plugin: " + plugin);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
- @AfterSuite
- public void stop()
- {
- PluginContainer.getInstance().shutdown();
- }
-
- @Test
- public void testPluginLoad()
- {
- PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
- PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
- assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
- assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
- }
-
- @Test(dependsOnMethods = "testPluginLoad")
- public void testDiscovery() throws Exception
- {
- InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
- System.out.println("Found " + resources.size() + " hibernate services");
- }
-
- @Test(dependsOnMethods = "testDiscovery")
- public void testMeasurement() throws Exception
- {
- for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
- {
- testResourceMeasurement(server);
- }
- }
-
- private Set<Resource> findResource(Resource parent, String typeName)
- {
- Set<Resource> found = new HashSet<Resource>();
- @SuppressWarnings({"UnnecessaryLocalVariable"})
- Resource platform = parent;
- for (Resource resource : platform.getChildResources())
- {
- if (resource.getResourceType().getName().equals(typeName))
- {
- found.add(resource);
- }
- if (resource.getChildResources() != null)
- {
- for (Resource child : found)
- {
- found.addAll(findResource(child,typeName));
- }
- }
- }
- return found;
- }
-
- private void testResourceMeasurement(Resource resource)throws Exception
- {
- ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
- if (resourceComponent instanceof MeasurementFacet)
- {
- for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
- {
- Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
- metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
- MeasurementReport report = new MeasurementReport();
- ((MeasurementFacet) resourceComponent).getValues(report, metricList);
-
- assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
- MeasurementData data = report.getNumericData().iterator().next();
- assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
- System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
- }
- }
- }
-}
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc. All rights reserved.
+ */
+
+package org.rhq.plugins.hibernate.test;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.discovery.InventoryReport;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.plugin.FileSystemPluginFinder;
+import org.rhq.core.pc.plugin.PluginEnvironment;
+import org.rhq.core.pc.plugin.PluginManager;
+
+/**
+ * @author Greg Hinkle
+ */
+@Test(groups = "hibernate-plugin")
+public class HibernatePluginTest
+{
+ private Log log = LogFactory.getLog(HibernatePluginTest.class);
+ private static final String PLUGIN_NAME = "Hibernate";
+
+ @BeforeSuite
+ public void start()
+ {
+ try
+ {
+ File pluginDir = new File("target/itest/plugins");
+ PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
+ pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
+ pcConfig.setPluginDirectory(pluginDir);
+
+ pcConfig.setInsideAgent(false);
+ PluginContainer.getInstance().setConfiguration(pcConfig);
+ PluginContainer.getInstance().initialize();
+ log.info("PC started.");
+ for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
+ log.info("...Loaded plugin: " + plugin);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterSuite
+ public void stop()
+ {
+ PluginContainer.getInstance().shutdown();
+ }
+
+ @Test
+ public void testPluginLoad()
+ {
+ PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
+ PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
+ assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
+ assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
+ }
+
+ @Test(dependsOnMethods = "testPluginLoad")
+ public void testDiscovery() throws Exception
+ {
+ InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
+ System.out.println("Found " + resources.size() + " hibernate services");
+ }
+
+ @Test(dependsOnMethods = "testDiscovery")
+ public void testMeasurement() throws Exception
+ {
+ for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
+ {
+ testResourceMeasurement(server);
+ }
+ }
+
+ private Set<Resource> findResource(Resource parent, String typeName)
+ {
+ Set<Resource> found = new HashSet<Resource>();
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ Resource platform = parent;
+ for (Resource resource : platform.getChildResources())
+ {
+ if (resource.getResourceType().getName().equals(typeName))
+ {
+ found.add(resource);
+ }
+ if (resource.getChildResources() != null)
+ {
+ for (Resource child : found)
+ {
+ found.addAll(findResource(child,typeName));
+ }
+ }
+ }
+ return found;
+ }
+
+ private void testResourceMeasurement(Resource resource)throws Exception
+ {
+ ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
+ if (resourceComponent instanceof MeasurementFacet)
+ {
+ for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
+ {
+ Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
+ metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
+ MeasurementReport report = new MeasurementReport();
+ ((MeasurementFacet) resourceComponent).getValues(report, metricList);
+
+ assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
+ MeasurementData data = report.getNumericData().iterator().next();
+ assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
+ System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
+ }
+ }
+ }
+}
commit c2a8935bee269d7de10e85acc72ac386a3bf4163
Merge: 7edf5e9... fb6c170...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:27:55 2010 -0400
Merge branch 'bundle-jay' into bundle
Conflicts:
modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/layout/summary.xhtml
commit 7edf5e906e021a7ef7614e91d058b9b9708acfb6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:26:13 2010 -0400
git forced LT commit.
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 8fd84d9..e616f0f 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
@@ -1,244 +1,244 @@
-<?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:rich="http://richfaces.ajax4jsf.org/rich"
- xmlns:fn="http://java.sun.com/jsp/jstl/functions"
- xmlns:onc="http://jboss.org/on/component"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:onf="http://jboss.org/on/function">
-
-THIS TEXT WILL BE REMOVED.
-
-The template for the summary section of all Resource Group pages (i.e. the Monitor/Inventory/etc. tabbed pages).
-NOTE: This template is leveraged by both Facelets pages and JSP/Tiles pages.
-
-REQUEST PARAMETERS:
-groupId - the group id of the Group being accessed
-
-<ui:composition>
-
- <h:form id="groupHeaderSummaryForm">
-
- <input type="hidden" name="groupId" value="#{ResourceGroupUIBean.groupId}"/>
- <input type="hidden" name="parentGroupId" value="#{param.parentGroupId}"/>
- <input type="hidden" name="category" value="#{param.category}"/>
-
-
-
-
-
-
-<style type="text/css">
- \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header {
- background-color: white;
- border: none;
- }
-
- \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header > .dr-stglpanel-marker {
- float: left;
- padding-left: 10px;
- }
-</style>
-
-
-<h:panelGroup layout="block" style="width: 100%; background-color: #E5E5E5;">
-
-
- <table width="100%" style="align: center; padding-top: 5px;" cellpadding="0" cellspacing="0">
- <tr>
- <td>
-
- <h:graphicImage value="/images/icons/${ResourceGroupUIBean.compatible ? 'Cluster' : 'Group' }_up_24.png"/>
- <h:outputText style="font-size: 18px;" value="#{ResourceGroupUIBean.name}"/>
-
- </td>
- <td width="30">
- <h:graphicImage value="/images/icons/availability_green_24.png" alt="Up" title="Up"
- rendered="#{ResourceGroupUIBean.availability == 1}"/>
- <h:graphicImage value="/images/icons/availability_red_24.png" alt="Down" title="Down"
- rendered="#{ResourceGroupUIBean.availability == 0}"/>
- <h:graphicImage value="/images/icons/availability_yellow_24.png" alt="Mixed" title="Mixed"
- rendered="#{ResourceGroupUIBean.availability gt 0 and ResourceGroupUIBean.availability lt 1}"/>
- <h:graphicImage value="/images/icons/availability_grey_24.png" alt="Unknown" title="Unknown"
- rendered="#{ResourceGroupUIBean.availability == null}"/>
- </td>
-
- <td width="30">
- <a4j:region>
- <h:graphicImage style="z-index: 10;" id="favoritesStar"
- value="#{ResourceGroupUIBean.favorite ? '/images/icons/Favorite_24.png' : '/images/icons/Favorite_grey_24.png'}">
- <a4j:support event="onclick"
- action="#{ResourceGroupUIBean.toggleFavorite}"
- reRender="favoritesStar, groupsMenu"
- ajaxSingle="true"
- status="commonStatus"
- disableDefault="true"/>
- </h:graphicImage>
-
-
- <rich:toolTip for="favoritesStar">
- <h:outputText value="Add resource to favorites list"
- rendered="#{!ResourceGroupUIBean.favorite}"/>
- <h:outputText value="Remove resource from favorites list"
- rendered="#{ResourceGroupUIBean.favorite}"/>
- </rich:toolTip>
- </a4j:region>
- </td>
- </tr>
- </table>
-
-
-
- </h:panelGroup>
-
- <rich:simpleTogglePanel switchType="ajax" id="summary-toggle-panel" headerClass="summaryHeader"
- actionListener="#{UserPreferencesUIBean.updateSummaryPanelDisplayState}"
- value="#{UserPreferencesUIBean.summaryPanelDisplayState}">
-
-
- <f:facet name="openMarker"><h:graphicImage value="/images/summaryHidden.png"/> </f:facet>
- <f:facet name="closeMarker"><h:graphicImage value="/images/summaryShown.png"/> </f:facet>
-
- <f:facet name="header">Summary</f:facet>
-
-
-
- <h:panelGrid columns="2" width="100%" style="padding: 3px;">
-
- <h:panelGroup layout="block" styleClass="summary-content">
-
- <!-- general properties (type, version, etc.) -->
- <h:panelGrid columns="2" styleClass="summary-props-table" style=""
- columnClasses="summary-prop-cell">
- <h:panelGroup layout="block">
- <h:outputText value="Type: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceGroupUIBean.resourceType.name}
- (#{ResourceGroupUIBean.resourceType.category.displayName})"
- rendered="#{!empty ResourceGroupUIBean.resourceType}"/>
- <h:outputText value="Mixed Types" style="font-style: italic"
- rendered="#{empty ResourceGroupUIBean.resourceType}"/>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <h:outputText value="Description: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceGroupUIBean.description}"
- rendered="#{!empty ResourceGroupUIBean.description}"/>
- <h:outputText value="none" style="font-style: italic"
- rendered="#{empty ResourceGroupUIBean.description}"/>
- </h:panelGroup>
-
-
- </h:panelGrid>
-
- <!-- spacer -->
- <h:panelGroup layout="block" style="height: 13px"/>
-
- </h:panelGroup>
-
-
- <ui:remove><!-- the blue box at the top right --></ui:remove>
- <h:panelGroup layout="block">
-
- <h:panelGrid columns="1" columnClasses="LinkBoxCell">
-
-
- </h:panelGrid>
-
- </h:panelGroup>
-
- </h:panelGrid>
-
- <ui:param name="resourceGroupMembersDataModel" value="#{ResourceGroupSummaryUIBean.dataModel}"/>
-
- <rich:dataTable id="resourceGroupMembersDataTable"
- rows="#{PageControl.MiniResourceGroupMemberList.pageSize}"
- style="width: 80%; margin-left: 10%; margin-right: 10%;"
- rendered="#{ResourceGroupUIBean.compatible}"
- value="#{resourceGroupMembersDataModel}"
- var="resourceWithAvailability"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer">
-
- <f:facet name="PageControlView">
- <onc:paginationControl id="MiniResourceGroupMemberList"/>
- </f:facet>
-
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="res.name">
- <h:outputText styleClass="headerText" value="Name"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
- <f:param name="id" value="#{resourceWithAvailability.resource.id}"/>
- <h:outputText value="#{resourceWithAvailability.resource.name}"/>
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="parent.name">
- <h:outputText styleClass="headerText" value="Parent"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
- <f:param name="id" value="#{resourceWithAvailability.parent.id}"/>
- <h:outputText value="#{resourceWithAvailability.parent.name}"/>
- </h:outputLink>
- </rich:column>
-
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="a.availabilityType">
- <h:outputText styleClass="headerText" value="Availability"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:graphicImage value="/images/icons/availability_green_16.png" alt="Up" title="Up"
- rendered="#{resourceWithAvailability.availability == 'UP'}"/>
- <h:graphicImage value="/images/icons/availability_red_16.png" alt="Down" title="Down"
- rendered="#{resourceWithAvailability.availability == 'DOWN'}"/>
- <h:graphicImage value="/images/icons/availability_grey_16.png" alt="Unknown" title="Unknown"
- rendered="#{resourceWithAvailability.availability == null}"/>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="3" width="100%">
-
- <ui:param name="paginationDataTableName" value="resourceGroupMembersDataTable"/>
- <ui:param name="paginationDataModel" value="#{resourceGroupMembersDataModel}"/>
- <ui:param name="paginationPageControl" value="#{PageControl.MiniResourceGroupMemberList}"/>
- <ui:param name="paginationUIBean" value="#{ResourceGroupSummaryUIBean}"/>
- <ui:include src="/rhq/resource/include/pagination.xhtml"/>
-
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
-
- </rich:simpleTogglePanel>
-
- </h:form>
-
- <rich:spacer height="10"/>
-
-</ui:composition>
-
-THIS TEXT WILL BE REMOVED AS WELL.
-
-</html>
+<?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:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:onc="http://jboss.org/on/component"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:onf="http://jboss.org/on/function">
+
+THIS TEXT WILL BE REMOVED.
+
+The template for the summary section of all Resource Group pages (i.e. the Monitor/Inventory/etc. tabbed pages).
+NOTE: This template is leveraged by both Facelets pages and JSP/Tiles pages.
+
+REQUEST PARAMETERS:
+groupId - the group id of the Group being accessed
+
+<ui:composition>
+
+ <h:form id="groupHeaderSummaryForm">
+
+ <input type="hidden" name="groupId" value="#{ResourceGroupUIBean.groupId}"/>
+ <input type="hidden" name="parentGroupId" value="#{param.parentGroupId}"/>
+ <input type="hidden" name="category" value="#{param.category}"/>
+
+
+
+
+
+
+<style type="text/css">
+ \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header {
+ background-color: white;
+ border: none;
+ }
+
+ \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header > .dr-stglpanel-marker {
+ float: left;
+ padding-left: 10px;
+ }
+</style>
+
+
+<h:panelGroup layout="block" style="width: 100%; background-color: #E5E5E5;">
+
+
+ <table width="100%" style="align: center; padding-top: 5px;" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+
+ <h:graphicImage value="/images/icons/${ResourceGroupUIBean.compatible ? 'Cluster' : 'Group' }_up_24.png"/>
+ <h:outputText style="font-size: 18px;" value="#{ResourceGroupUIBean.name}"/>
+
+ </td>
+ <td width="30">
+ <h:graphicImage value="/images/icons/availability_green_24.png" alt="Up" title="Up"
+ rendered="#{ResourceGroupUIBean.availability == 1}"/>
+ <h:graphicImage value="/images/icons/availability_red_24.png" alt="Down" title="Down"
+ rendered="#{ResourceGroupUIBean.availability == 0}"/>
+ <h:graphicImage value="/images/icons/availability_yellow_24.png" alt="Mixed" title="Mixed"
+ rendered="#{ResourceGroupUIBean.availability gt 0 and ResourceGroupUIBean.availability lt 1}"/>
+ <h:graphicImage value="/images/icons/availability_grey_24.png" alt="Unknown" title="Unknown"
+ rendered="#{ResourceGroupUIBean.availability == null}"/>
+ </td>
+
+ <td width="30">
+ <a4j:region>
+ <h:graphicImage style="z-index: 10;" id="favoritesStar"
+ value="#{ResourceGroupUIBean.favorite ? '/images/icons/Favorite_24.png' : '/images/icons/Favorite_grey_24.png'}">
+ <a4j:support event="onclick"
+ action="#{ResourceGroupUIBean.toggleFavorite}"
+ reRender="favoritesStar, groupsMenu"
+ ajaxSingle="true"
+ status="commonStatus"
+ disableDefault="true"/>
+ </h:graphicImage>
+
+
+ <rich:toolTip for="favoritesStar">
+ <h:outputText value="Add resource to favorites list"
+ rendered="#{!ResourceGroupUIBean.favorite}"/>
+ <h:outputText value="Remove resource from favorites list"
+ rendered="#{ResourceGroupUIBean.favorite}"/>
+ </rich:toolTip>
+ </a4j:region>
+ </td>
+ </tr>
+ </table>
+
+
+
+ </h:panelGroup>
+
+ <rich:simpleTogglePanel switchType="ajax" id="summary-toggle-panel" headerClass="summaryHeader"
+ actionListener="#{UserPreferencesUIBean.updateSummaryPanelDisplayState}"
+ value="#{UserPreferencesUIBean.summaryPanelDisplayState}">
+
+
+ <f:facet name="openMarker"><h:graphicImage value="/images/summaryHidden.png"/> </f:facet>
+ <f:facet name="closeMarker"><h:graphicImage value="/images/summaryShown.png"/> </f:facet>
+
+ <f:facet name="header">Summary</f:facet>
+
+
+
+ <h:panelGrid columns="2" width="100%" style="padding: 3px;">
+
+ <h:panelGroup layout="block" styleClass="summary-content">
+
+ <!-- general properties (type, version, etc.) -->
+ <h:panelGrid columns="2" styleClass="summary-props-table" style=""
+ columnClasses="summary-prop-cell">
+ <h:panelGroup layout="block">
+ <h:outputText value="Type: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceGroupUIBean.resourceType.name}
+ (#{ResourceGroupUIBean.resourceType.category.displayName})"
+ rendered="#{!empty ResourceGroupUIBean.resourceType}"/>
+ <h:outputText value="Mixed Types" style="font-style: italic"
+ rendered="#{empty ResourceGroupUIBean.resourceType}"/>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <h:outputText value="Description: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceGroupUIBean.description}"
+ rendered="#{!empty ResourceGroupUIBean.description}"/>
+ <h:outputText value="none" style="font-style: italic"
+ rendered="#{empty ResourceGroupUIBean.description}"/>
+ </h:panelGroup>
+
+
+ </h:panelGrid>
+
+ <!-- spacer -->
+ <h:panelGroup layout="block" style="height: 13px"/>
+
+ </h:panelGroup>
+
+
+ <ui:remove><!-- the blue box at the top right --></ui:remove>
+ <h:panelGroup layout="block">
+
+ <h:panelGrid columns="1" columnClasses="LinkBoxCell">
+
+
+ </h:panelGrid>
+
+ </h:panelGroup>
+
+ </h:panelGrid>
+
+ <ui:param name="resourceGroupMembersDataModel" value="#{ResourceGroupSummaryUIBean.dataModel}"/>
+
+ <rich:dataTable id="resourceGroupMembersDataTable"
+ rows="#{PageControl.MiniResourceGroupMemberList.pageSize}"
+ style="width: 80%; margin-left: 10%; margin-right: 10%;"
+ rendered="#{ResourceGroupUIBean.compatible}"
+ value="#{resourceGroupMembersDataModel}"
+ var="resourceWithAvailability"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer">
+
+ <f:facet name="PageControlView">
+ <onc:paginationControl id="MiniResourceGroupMemberList"/>
+ </f:facet>
+
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="res.name">
+ <h:outputText styleClass="headerText" value="Name"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
+ <f:param name="id" value="#{resourceWithAvailability.resource.id}"/>
+ <h:outputText value="#{resourceWithAvailability.resource.name}"/>
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="parent.name">
+ <h:outputText styleClass="headerText" value="Parent"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
+ <f:param name="id" value="#{resourceWithAvailability.parent.id}"/>
+ <h:outputText value="#{resourceWithAvailability.parent.name}"/>
+ </h:outputLink>
+ </rich:column>
+
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="a.availabilityType">
+ <h:outputText styleClass="headerText" value="Availability"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:graphicImage value="/images/icons/availability_green_16.png" alt="Up" title="Up"
+ rendered="#{resourceWithAvailability.availability == 'UP'}"/>
+ <h:graphicImage value="/images/icons/availability_red_16.png" alt="Down" title="Down"
+ rendered="#{resourceWithAvailability.availability == 'DOWN'}"/>
+ <h:graphicImage value="/images/icons/availability_grey_16.png" alt="Unknown" title="Unknown"
+ rendered="#{resourceWithAvailability.availability == null}"/>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="3" width="100%">
+
+ <ui:param name="paginationDataTableName" value="resourceGroupMembersDataTable"/>
+ <ui:param name="paginationDataModel" value="#{resourceGroupMembersDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.MiniResourceGroupMemberList}"/>
+ <ui:param name="paginationUIBean" value="#{ResourceGroupSummaryUIBean}"/>
+ <ui:include src="/rhq/resource/include/pagination.xhtml"/>
+
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+
+ </rich:simpleTogglePanel>
+
+ </h:form>
+
+ <rich:spacer height="10"/>
+
+</ui:composition>
+
+THIS TEXT WILL BE REMOVED AS WELL.
+
+</html>
commit fb6c1708598b5ff920210ee5a43a7f68b32a7126
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 13:23:55 2010 -0400
Partially revert the fix for
https://bugzilla.redhat.com/show_bug.cgi?id=562236
Leave the change moving to OID from bytea for Postgres PackageBits.bits
but eliminate the use for Hibernate classes (SerializableBlob and BlobImpl).
These classes can not be used in the CLI or Agent (or anywhere for in
GWT-Aware classes).
This change goes back to using byte[] for the bits field. This seems to
work fine for the purposes of the unit tests ans scripst, so we can again
move forward with bundle deployment etc. Whether or not this pairing
solves the issue with the BZ I'm not sure. It needs to be tested and if
its no good we need another, possible native (non-hibernate) solution
for streaming the bits back and forth.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageBits.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageBits.java
index 185d463..2bf059c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageBits.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageBits.java
@@ -38,8 +38,6 @@ import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlTransient;
-import org.hibernate.lob.SerializableBlob;
-
/**
* Contains the actual package contents ("the bits") for a particular {@link PackageVersion}.
*
@@ -75,10 +73,10 @@ public class PackageBits implements Serializable {
private int id;
@Lob
- @Basic(fetch=FetchType.LAZY)
+ @Basic(fetch = FetchType.LAZY)
@Column(name = "BITS", nullable = true)
@XmlTransient
- private SerializableBlob bits;
+ private byte[] bits;
public PackageBits() {
// for JPA use
@@ -99,11 +97,11 @@ public class PackageBits implements Serializable {
* on the {@link PackageVersion} details.
*/
@XmlTransient
- public SerializableBlob getBits() {
+ public byte[] getBits() {
return bits;
}
- public void setBits(SerializableBlob bits) {
+ public void setBits(byte[] bits) {
this.bits = bits;
}
}
\ No newline at end of file
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java
index 5d19cfc..b921cce 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java
@@ -27,8 +27,6 @@ import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
-import org.hibernate.lob.BlobImpl;
-import org.hibernate.lob.SerializableBlob;
import org.testng.annotations.Test;
import org.rhq.core.domain.configuration.Configuration;
@@ -252,7 +250,7 @@ public class PackageVersionContentSourceTest extends AbstractEJB3Test {
pvConfig.put(new PropertySimple("pvConfig1", "pvConfig1Value"));
pv.setExtraProperties(pvConfig);
- bits.setBits(new SerializableBlob(new BlobImpl("testDeleteOrphanedPV".getBytes())));
+ bits.setBits("testDeleteOrphanedPV".getBytes());
pv.setPackageBits(bits); // this will cascade on persist
em.persist(rt);
@@ -287,10 +285,7 @@ public class PackageVersionContentSourceTest extends AbstractEJB3Test {
em.close();
assert findBits != null : "The bits did not cascade-persist for some reason";
assert findBits.getId() > 0 : "The package bits did not cascade-persist for some reason!";
- SerializableBlob blob = bits.getBits();
- SerializableBlob blob2 = findBits.getBits();
- assert new String(blob.getBytes(1, (int) blob.length())).equals(new String(blob2.getBytes(1, (int) blob2
- .length())));
+ assert new String(bits.getBits()).equals(new String(findBits.getBits()));
em = getEntityManager();
q = em.createNamedQuery(PackageVersion.DELETE_IF_NO_CONTENT_SOURCES_OR_REPOS);
diff --git a/modules/enterprise/remoting/webservices/pom.xml b/modules/enterprise/remoting/webservices/pom.xml
index 3a870c3..6f080c8 100644
--- a/modules/enterprise/remoting/webservices/pom.xml
+++ b/modules/enterprise/remoting/webservices/pom.xml
@@ -80,19 +80,6 @@
<classifier>jdk15</classifier>
</dependency>
- <dependency>
- <groupId>hibernate</groupId>
- <artifactId>hibernate3</artifactId>
- <!-- NOTE: The version is defined in the root POM's dependencyManagement section. -->
- <scope>compile</scope> <!-- by JBossAS -->
- </dependency>
-
- <dependency>
- <groupId>hibernate-annotations</groupId>
- <artifactId>hibernate-annotations</artifactId>
- <!-- NOTE: The version is defined in the root POM's dependencyManagement section. -->
- <scope>compile</scope> <!-- by JBossAS -->
- </dependency>
</dependencies>
<build>
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java
index 3df1acf..49f8d17 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentManagerBean.java
@@ -37,7 +37,6 @@ import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
@@ -45,9 +44,9 @@ import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.hibernate.lob.BlobImpl;
-import org.hibernate.lob.SerializableBlob;
+
import org.jboss.annotation.ejb.TransactionTimeout;
+
import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.clientapi.agent.content.ContentAgentService;
import org.rhq.core.clientapi.server.content.ContentServiceResponse;
@@ -792,37 +791,37 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
+ installedPackageId + "] for resource ID [" + resourceId + "]");
}
try {
- InstalledPackage installedPackage = entityManager.find(InstalledPackage.class, installedPackageId);
- PackageBits bits = installedPackage.getPackageVersion().getPackageBits();
- if (bits == null || bits.getBits().length()==0) {
- long start = System.currentTimeMillis();
- retrieveBitsFromResource(user, resourceId, installedPackageId);
+ InstalledPackage installedPackage = entityManager.find(InstalledPackage.class, installedPackageId);
+ PackageBits bits = installedPackage.getPackageVersion().getPackageBits();
+ if (bits == null || bits.getBits().length == 0) {
+ long start = System.currentTimeMillis();
+ retrieveBitsFromResource(user, resourceId, installedPackageId);
- bits = installedPackage.getPackageVersion().getPackageBits();
- while ((bits == null || bits.getBits() == null) && (System.currentTimeMillis() - start < 30000)) {
- try {
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- }
- entityManager.clear();
- installedPackage = entityManager.find(InstalledPackage.class, installedPackageId);
bits = installedPackage.getPackageVersion().getPackageBits();
- }
+ while ((bits == null || bits.getBits() == null) && (System.currentTimeMillis() - start < 30000)) {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ }
+ entityManager.clear();
+ installedPackage = entityManager.find(InstalledPackage.class, installedPackageId);
+ bits = installedPackage.getPackageVersion().getPackageBits();
+ }
+
+ if (bits == null) {
+ throw new RuntimeException("Unable to retrieve package bits for resource: " + resourceId
+ + " and package: " + installedPackageId + " before timeout.");
+ }
- if (bits == null) {
- throw new RuntimeException("Unable to retrieve package bits for resource: " + resourceId
- + " and package: " + installedPackageId + " before timeout.");
}
-
- }
- return bits.getBits().getBytes(1, (int) bits.getBits().length());
-}catch(Exception e){
- throw new RuntimeException("Unable to retrieve package bits for resource: " + resourceId
- + " and package: " + installedPackageId + " before timeout.");
-
+ return bits.getBits();
+ } catch (Exception e) {
+ throw new RuntimeException("Unable to retrieve package bits for resource: " + resourceId + " and package: "
+ + installedPackageId + " before timeout.");
+
}
-
+
}
public List<DeployPackageStep> translateInstallationSteps(int resourceId, ResourcePackageDetails packageDetails)
@@ -877,8 +876,8 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
return persistedRequest;
}
- @TransactionTimeout(45 * 60)
- @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ @TransactionTimeout(45 * 60)
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void completeRetrievePackageBitsRequest(ContentServiceResponse response, InputStream bitStream) {
log.info("Completing retrieve package bits response: " + response);
@@ -904,7 +903,6 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
log.debug("Saving content for response: " + response);
PackageBits packageBits = new PackageBits();
- // packageBits.setBits(new SerializableBlob(new BlobImpl(new byte[0])));
entityManager.persist(packageBits);
packageVersion.setPackageBits(packageBits);
@@ -926,13 +924,10 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
PreparedStatement ps = null;
try {
- // fallback to JDBC so we can stream the data to the blob column
- //conn = dataSource.getConnection();
- PackageBits bits = entityManager.find(PackageBits.class, packageBits.getId());
- SerializableBlob blb = new SerializableBlob(new BlobImpl(bitStream,(int)length.longValue()));
- bits.setBits(blb);
+ PackageBits bits = entityManager.find(PackageBits.class, packageBits.getId());
+ bits.setBits(StreamUtil.slurp(bitStream));
entityManager.merge(bits);
-
+
} finally {
if (ps != null) {
@@ -1231,9 +1226,9 @@ public class ContentManagerBean implements ContentManagerLocal, ContentManagerRe
PackageBits bits = new PackageBits();
try {
- bits.setBits(new SerializableBlob(new BlobImpl(packageBits)));
- }catch(Exception e){
- log.error("Error savinf the package.",e);
+ bits.setBits(packageBits);
+ } catch (Exception e) {
+ log.error("Error savinf the package.", e);
}
newPackageVersion.setPackageBits(bits);
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 8c59322..317656b 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
@@ -19,13 +19,13 @@
package org.rhq.enterprise.server.content;
import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -44,8 +44,6 @@ import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
-import javax.persistence.FlushModeType;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
@@ -53,10 +51,10 @@ import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.hibernate.lob.BlobImpl;
-import org.hibernate.lob.SerializableBlob;
+
import org.jboss.annotation.ejb.TransactionTimeout;
import org.jboss.util.StringPropertyReplacer;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.content.Advisory;
@@ -830,7 +828,6 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
try {
packageBits = new PackageBits();
- // packageBits.setBits(new SerializableBlob(new BlobImpl(new byte[0])));
entityManager.persist(packageBits);
PackageVersion pv = entityManager.find(PackageVersion.class, packageVersionId);
@@ -839,15 +836,14 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
entityManager.flush(); // push the new package bits row to the DB
if (pk.getContentSource().getDownloadMode() == DownloadMode.DATABASE) {
-
+
PackageBits bits = entityManager.find(PackageBits.class, packageBits.getId());
- SerializableBlob blb = new SerializableBlob(new BlobImpl(bitsStream,(int)pv.getFileSize().intValue()));
- bits.setBits(blb);
-
+ bits.setBits(StreamUtil.slurp(bitsStream));
+
entityManager.merge(bits);
- entityManager.flush();
- bitsStream = null;
-
+ entityManager.flush();
+ bitsStream = null;
+
} else {
// store content to local file system
File outputFile = getPackageBitsLocalFileAndCreateParentDir(pv.getId(), pv.getFileName());
@@ -1884,8 +1880,8 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
// this is DownloadMode.DATABASE - put the bits in the database
PackageBits bits = entityManager.find(PackageBits.class, composite.getPackageBitsId());
- bitsStream = bits.getBits().getBinaryStream();
-
+ bitsStream = new ByteArrayInputStream(bits.getBits());
+
} else {
// this is DownloadMode.FILESYSTEM - put the bits on the filesystem
File bitsFile = getPackageBitsLocalFileAndCreateParentDir(composite.getPackageVersionId(),
@@ -1911,7 +1907,7 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
long length = (endByte - startByte) + 1;
bytesRetrieved = StreamUtil.copy(bis, outputStream, startByte, length);
}
-
+
// close our stream but leave the output stream open
try {
bitsStream.close();
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
index d45948e..b83695f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
@@ -22,8 +22,6 @@ import javax.persistence.EntityManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.hibernate.lob.BlobImpl;
-import org.hibernate.lob.SerializableBlob;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -115,7 +113,7 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// now lets store some bits in the DB
final String DATA = "testPackageBits data";
- packageBits.setBits(new SerializableBlob(new BlobImpl(DATA.getBytes())));
+ packageBits.setBits(DATA.getBytes());
em.merge(packageBits);
em.flush();
@@ -130,8 +128,7 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// let's make sure the data really is in the DB
packageBits = em.find(PackageBits.class, packageBits.getId());
assert packageBits != null;
- SerializableBlob blob = packageBits.getBits();
- assert DATA.equals(new String(blob.getBytes(1, (int) blob.length())));
+ assert DATA.equals(new String(packageBits.getBits()));
////////////////////////////////////////////////////
// create another package version and test with that
@@ -186,7 +183,7 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// now lets store some bits in the DB
final String DATA2 = "testPackageBits more data";
- packageBits2.setBits(new SerializableBlob(new BlobImpl(DATA2.getBytes())));
+ packageBits2.setBits(DATA2.getBytes());
em.merge(packageBits2);
em.flush();
@@ -209,8 +206,7 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// let's make sure the data really is in the DB
packageBits2 = em.find(PackageBits.class, packageBits2.getId());
assert packageBits2 != null;
- blob = packageBits2.getBits();
- assert DATA2.equals(new String(blob.getBytes(1, (int) blob.length())));
+ assert DATA2.equals(new String(packageBits2.getBits()));
} catch (Throwable t) {
t.printStackTrace();
throw t;
commit 7bc9d1a8b26dc337c9459fa0a561c69e37de8c2f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 12:36:20 2010 -0400
Better test cleanup
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index 0edf73e..19078e3 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -43,22 +43,16 @@ function testDeployment() {
}
// delete the test bundle if it exists
- var bc = new BundleCriteria();
- bc.addFilterName( bundleName );
- var bundles = BundleManager.findBundlesByCriteria( bc );
- if ( null != bundles && bundles.size() > 0 ) {
- print( "\n Deleting existing testScriptBundle in order to test a fresh deploy...")
- BundleManager.deleteBundle( bundles.get(0).getId() );
- }
+ cleanupTestBundle();
// create the test bundle
- var testBundle = BundleManager.createBundle( bundleName, getBundleType() );
+ var testBundle = BundleManager.createBundle( bundleName, bundleName, getBundleType() );
// define the recipe for bundleVersion 1.0
var recipe = "file -s testBundle.war -d <%bundleTest.deployHome%>/testBundle.war"
// create bundleVersion 1.0
- var testBundleVersion = BundleManager.createBundleVersion( testBundle.getId(), bundleName, null, recipe);
+ var testBundleVersion = BundleManager.createBundleVersion( testBundle.getId(), bundleName, bundleName, null, recipe);
// add the single bundleFile, the test war file
var fileBytes = scriptUtil.getFileBytes("./src/test/resources/testBundle.war");
@@ -79,7 +73,13 @@ function testDeployment() {
var winPlatforms = ResourceManager.findResourcesByCriteria(rc);
var platformId = winPlatforms.get(0).getId();
- var bundleScheduleResponse = BundleManager.scheduleBundleDeployment(testDeployDef.getId(), platformId);
+ var bd = BundleManager.scheduleBundleDeployment(testDeployDef.getId(), platformId);
+ Assert.assertNotNull( bd );
+
+
+ // delete the test bundle if it exists (after allowing agent audit messages to complete)
+ sleep( 5000 );
+ cleanupTestBundle();
}
function getBundleType() {
@@ -93,3 +93,15 @@ function getBundleType() {
print( "\n Could not find template bundle type, is the plugin loaded?");
}
+
+function cleanupTestBundle() {
+ // delete the test bundle if it exists
+ var bc = new BundleCriteria();
+ bc.addFilterName( bundleName );
+ var bundles = BundleManager.findBundlesByCriteria( bc );
+ if ( null != bundles && bundles.size() > 0 ) {
+ print( "\n Deleting existing testScriptBundle in order to test a fresh deploy...")
+ BundleManager.deleteBundle( bundles.get(0).getId() );
+ }
+}
+
commit c1061dbd4966d3edaf45b08f55be2523cf5f607f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 15 12:34:58 2010 -0400
Throw a useful exception if the user has failed to import the necessary
Bundle handler resource for this deployment.
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index 798db91..3bd4c8b 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -122,6 +122,10 @@ public class BundleManager extends AgentService implements BundleAgentService, B
// pull down the bundle files that the plugin will need in order to process the bundle
ResourceContainer resourceContainer = im.getResourceContainer(bundleHandlerResourceId);
+ if (null == resourceContainer.getResourceContext()) {
+ throw new Exception("No bundle plugin resource available to handle deployment for bundle type ["
+ + bundleType + "]. Ensure it is imported into inventory.");
+ }
File pluginTmpDir = resourceContainer.getResourceContext().getTemporaryDirectory();
File bundleFilesDir = new File(pluginTmpDir, "" + bundleDeployDef.getBundleVersion().getId());
Map<PackageVersion, File> downloadedFiles = downloadBundleFiles(deployment, bundleFilesDir);
commit 8743b4a79f381055f03c44b8f37b3d1637420ddf
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 15:19:45 2010 -0500
Add description fields to Bundle and BundleVersion.
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
index 094fb63..b2663d4 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml
@@ -498,6 +498,7 @@
<table name="RHQ_BUNDLE">
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="NAME" size="200" type="VARCHAR2" required="true"/>
+ <column name="DESCRIPTION" size="500" type="VARCHAR2" required="false"/>
<column name="BUNDLE_TYPE_ID" type="INTEGER" required="true" references="RHQ_BUNDLE_TYPE"/>
<column name="REPO_ID" type="INTEGER" required="true" references="RHQ_REPO"/>
</table>
@@ -506,6 +507,7 @@
<table name="RHQ_BUNDLE_VERSION">
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="NAME" size="200" type="VARCHAR2" required="true"/>
+ <column name="DESCRIPTION" size="500" type="VARCHAR2" required="false"/>
<column name="VERSION" size="500" type="VARCHAR2" required="true"/>
<column name="ACTION" type="CLOB" required="true"/>
<column name="CONFIG_DEF_ID" type="INTEGER" required="false" references="RHQ_CONFIG_DEF" />
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index 015715a..85fe084 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3206,6 +3206,11 @@
</schema-directSQL>
</schemaSpec>
+ <schemaSpec version="2.78.2">
+ <schema-addColumn table="RHQ_BUNDLE" column="DESCRIPTION" columnType="VARCHAR2" precision="500" />
+ <schema-addColumn table="RHQ_BUNDLE_VERSION" column="DESCRIPTION" columnType="VARCHAR2" precision="500" />
+ </schemaSpec>
+
<schemaSpec version="2.79">
<schema-directSQL>
<statement desc="Normalizing resource group descriptions">
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
index 54fcc21..1573d6d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
@@ -78,6 +78,9 @@ public class Bundle implements Serializable {
@Column(name = "NAME", nullable = false)
private String name;
+ @Column(name = "DESCRIPTION", nullable = true)
+ private String description;
+
@JoinColumn(name = "BUNDLE_TYPE_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne(fetch = FetchType.EAGER)
private BundleType bundleType;
@@ -119,6 +122,14 @@ public class Bundle implements Serializable {
this.name = name;
}
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
public BundleType getBundleType() {
return bundleType;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java
index b70c53d..00eb979 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleVersion.java
@@ -73,6 +73,9 @@ public class BundleVersion implements Serializable {
@Column(name = "NAME", nullable = false)
private String name;
+ @Column(name = "DESCRIPTION", nullable = true)
+ private String description;
+
@Column(name = "VERSION", nullable = false)
private String version;
@@ -124,6 +127,14 @@ public class BundleVersion implements Serializable {
this.name = name;
}
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
public String getVersion() {
return version;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
index d58622c..4cdb772 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
@@ -36,7 +36,8 @@ public class BundleCriteria extends Criteria {
private Integer filterId;
private Integer filterBundleTypeId; // needs override
- private String filterBundleTypeName; // needs override
+ private String filterBundleTypeName; // needs override
+ private String filterDescription;
private String filterName;
private boolean fetchBundleVersions;
@@ -65,6 +66,10 @@ public class BundleCriteria extends Criteria {
this.filterName = filterBundleTypeName;
}
+ public void addFilterDescription(String filterDescription) {
+ this.filterDescription = filterDescription;
+ }
+
public void addFilterName(String filterName) {
this.filterName = filterName;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java
index 703fd8d..8c76a66 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java
@@ -35,6 +35,7 @@ public class BundleVersionCriteria extends Criteria {
private static final long serialVersionUID = 1L;
private Integer filterId;
+ private String filterDescription;
private String filterName;
private String filterVersion;
private String filterBundleName; // needs override
@@ -59,6 +60,10 @@ public class BundleVersionCriteria extends Criteria {
this.filterId = filterId;
}
+ public void addFilterDescription(String filterDescription) {
+ this.filterDescription = filterDescription;
+ }
+
public void addFilterName(String filterName) {
this.filterName = filterName;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index ce985e8..60e4c91 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -123,7 +123,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public Bundle createBundle(Subject subject, String name, int bundleTypeId) throws Exception {
+ public Bundle createBundle(Subject subject, String name, String description, int bundleTypeId) throws Exception {
if (null == name || "".equals(name.trim())) {
throw new IllegalArgumentException("Invalid bundleName: " + name);
}
@@ -134,6 +134,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
Bundle bundle = new Bundle(name, bundleType);
+ bundle.setDescription(description);
// create and add the required Repo. the Repo is a detached object ehich helps in its eventual
// removal.
@@ -204,8 +205,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String version, String recipe)
- throws Exception {
+ public BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String description,
+ String version, String recipe) throws Exception {
if (null == name || "".equals(name.trim())) {
throw new IllegalArgumentException("Invalid bundleVersionName: " + name);
}
@@ -225,6 +226,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
version = getVersion(version, bundle);
BundleVersion bundleVersion = new BundleVersion(name, version, bundle, recipe);
+ bundleVersion.setDescription(description);
bundleVersion.setConfigurationDefinition(results.getConfigDef());
entityManager.persist(bundleVersion);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index ac0bb4d..1308d90 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -108,12 +108,14 @@ public interface BundleManagerRemote {
/**
* @param subject must be InventoryManager
* @param name not null or empty
+ * @param description optional long description of the bundle
* @param bundleTypeId valid bundleType
* @return the persisted Bundle (id is assigned)
*/
Bundle createBundle( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "name") String name, //
+ @WebParam(name = "description") String description, //
@WebParam(name = "bundleTypeId") int bundleTypeId) throws Exception;
/**
@@ -144,14 +146,16 @@ public interface BundleManagerRemote {
* @param subject must be InventoryManager
* @param bundleId the bundle for which this will be the next version
* @param name not null or empty
- * @param bundleVersion optional. If not supplied set to 1.0 for first version, or incremented (as best as possible) for subsequent version
+ * @param description optional long description of the bundle version
+ * @param version optional. If not supplied set to 1.0 for first version, or incremented (as best as possible) for subsequent version
* @return the persisted BundleVersion (id is assigned)
*/
BundleVersion createBundleVersion( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleId") int bundleId, //
@WebParam(name = "name") String name, //
- @WebParam(name = "bundleVersion") String bundleVersion, //
+ @WebParam(name = "description") String description, //
+ @WebParam(name = "version") String version, //
@WebParam(name = "recipe") String recipe) throws Exception;
/**
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 5c00627..5b83cb4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -347,8 +347,8 @@ public class WebservicesManagerBean implements WebservicesRemote {
pinToPackage);
}
- public Bundle createBundle(Subject subject, String name, int bundleTypeId) throws Exception {
- return bundleManager.createBundle(subject, name, bundleTypeId);
+ public Bundle createBundle(Subject subject, String name, String description, int bundleTypeId) throws Exception {
+ return bundleManager.createBundle(subject, name, description, bundleTypeId);
}
public BundleDeployDefinition createBundleDeployDefinition(Subject subject, int bundleVersionId, String name,
@@ -358,9 +358,9 @@ public class WebservicesManagerBean implements WebservicesRemote {
enforcePolicy, enforcementInterval, pinToBundle);
}
- public BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String bundleVersion,
- String recipe) throws Exception {
- return bundleManager.createBundleVersion(subject, bundleId, name, bundleVersion, recipe);
+ public BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String description,
+ String version, String recipe) throws Exception {
+ return bundleManager.createBundleVersion(subject, bundleId, name, description, version, recipe);
}
public void deleteBundle(Subject subject, int bundleId) throws Exception {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index f00eb14..f05d8f9 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -474,7 +474,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private Bundle createBundle(String name, BundleType bt) throws Exception {
final String fullName = TEST_PREFIX + "-bundle-" + name;
- Bundle b = bundleManager.createBundle(overlord, fullName, bt.getId());
+ Bundle b = bundleManager.createBundle(overlord, fullName, fullName + "-desc", bt.getId());
assert b.getId() > 0;
assert b.getName().endsWith(fullName);
@@ -484,7 +484,8 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private BundleVersion createBundleVersion(String name, String version, Bundle bundle) throws Exception {
final String fullName = TEST_PREFIX + "-bundleversion-" + version + "-" + name;
final String recipe = "deploy -f " + TEST_PREFIX + ".zip -d <% test.path %>";
- BundleVersion bv = bundleManager.createBundleVersion(overlord, bundle.getId(), fullName, version, recipe);
+ BundleVersion bv = bundleManager.createBundleVersion(overlord, bundle.getId(), fullName, fullName + "-desc",
+ version, recipe);
assert bv.getId() > 0;
assert bv.getName().endsWith(fullName);
commit 3a4a9ab7c6a372868f6206781fb971bd5ff52679
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 15:10:39 2010 -0500
Get these tests to at least compile. Currently not compiling in master.
Can't currently vouch for whether the tests are actually valid.
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java b/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java
index 577f660..5d19cfc 100644
--- a/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java
+++ b/modules/core/domain/src/test/java/org/rhq/core/domain/content/test/PackageVersionContentSourceTest.java
@@ -1,37 +1,39 @@
- /*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
package org.rhq.core.domain.content.test;
import java.util.List;
+
import javax.persistence.EntityManager;
import javax.persistence.Query;
+
+import org.hibernate.lob.BlobImpl;
+import org.hibernate.lob.SerializableBlob;
import org.testng.annotations.Test;
+
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.content.Architecture;
-import org.rhq.core.domain.content.Repo;
-import org.rhq.core.domain.content.RepoContentSource;
-import org.rhq.core.domain.content.RepoPackageVersion;
import org.rhq.core.domain.content.ContentSource;
import org.rhq.core.domain.content.ContentSourceType;
import org.rhq.core.domain.content.Package;
@@ -40,6 +42,9 @@ import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.PackageVersionContentSource;
import org.rhq.core.domain.content.PackageVersionContentSourcePK;
+import org.rhq.core.domain.content.Repo;
+import org.rhq.core.domain.content.RepoContentSource;
+import org.rhq.core.domain.content.RepoPackageVersion;
import org.rhq.core.domain.content.ResourceRepo;
import org.rhq.core.domain.content.composite.PackageVersionMetadataComposite;
import org.rhq.core.domain.resource.Resource;
@@ -247,7 +252,7 @@ public class PackageVersionContentSourceTest extends AbstractEJB3Test {
pvConfig.put(new PropertySimple("pvConfig1", "pvConfig1Value"));
pv.setExtraProperties(pvConfig);
- bits.setBits("testDeleteOrphanedPV".getBytes());
+ bits.setBits(new SerializableBlob(new BlobImpl("testDeleteOrphanedPV".getBytes())));
pv.setPackageBits(bits); // this will cascade on persist
em.persist(rt);
@@ -282,7 +287,10 @@ public class PackageVersionContentSourceTest extends AbstractEJB3Test {
em.close();
assert findBits != null : "The bits did not cascade-persist for some reason";
assert findBits.getId() > 0 : "The package bits did not cascade-persist for some reason!";
- assert new String(bits.getBits()).equals(new String(findBits.getBits()));
+ SerializableBlob blob = bits.getBits();
+ SerializableBlob blob2 = findBits.getBits();
+ assert new String(blob.getBytes(1, (int) blob.length())).equals(new String(blob2.getBytes(1, (int) blob2
+ .length())));
em = getEntityManager();
q = em.createNamedQuery(PackageVersion.DELETE_IF_NO_CONTENT_SOURCES_OR_REPOS);
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
index c937ed8..d45948e 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/content/test/ContentUIManagerBeanTest.java
@@ -19,33 +19,21 @@
package org.rhq.enterprise.server.content.test;
import javax.persistence.EntityManager;
-import javax.persistence.Query;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.AfterMethod;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.lob.BlobImpl;
+import org.hibernate.lob.SerializableBlob;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.Package;
import org.rhq.core.domain.content.PackageBits;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
-import org.rhq.core.domain.content.PackageCategory;
-import org.rhq.core.domain.content.InstalledPackage;
-import org.rhq.core.domain.content.Repo;
-import org.rhq.core.domain.content.ResourceRepo;
-import org.rhq.core.domain.content.RepoPackageVersion;
-import org.rhq.core.domain.content.ProductVersionPackageVersion;
import org.rhq.core.domain.content.composite.LoadedPackageBitsComposite;
-import org.rhq.core.domain.content.composite.PackageVersionComposite;
import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ProductVersion;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.util.PageControl;
-import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.content.ContentUIManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
@@ -127,7 +115,7 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// now lets store some bits in the DB
final String DATA = "testPackageBits data";
- packageBits.setBits(DATA.getBytes());
+ packageBits.setBits(new SerializableBlob(new BlobImpl(DATA.getBytes())));
em.merge(packageBits);
em.flush();
@@ -142,7 +130,8 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// let's make sure the data really is in the DB
packageBits = em.find(PackageBits.class, packageBits.getId());
assert packageBits != null;
- assert DATA.equals(new String(packageBits.getBits()));
+ SerializableBlob blob = packageBits.getBits();
+ assert DATA.equals(new String(blob.getBytes(1, (int) blob.length())));
////////////////////////////////////////////////////
// create another package version and test with that
@@ -197,7 +186,7 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// now lets store some bits in the DB
final String DATA2 = "testPackageBits more data";
- packageBits2.setBits(DATA2.getBytes());
+ packageBits2.setBits(new SerializableBlob(new BlobImpl(DATA2.getBytes())));
em.merge(packageBits2);
em.flush();
@@ -220,7 +209,8 @@ public class ContentUIManagerBeanTest extends AbstractEJB3Test {
// let's make sure the data really is in the DB
packageBits2 = em.find(PackageBits.class, packageBits2.getId());
assert packageBits2 != null;
- assert DATA2.equals(new String(packageBits2.getBits()));
+ blob = packageBits2.getBits();
+ assert DATA2.equals(new String(blob.getBytes(1, (int) blob.length())));
} catch (Throwable t) {
t.printStackTrace();
throw t;
commit 4649400eb2bb68dc9b599e434da43d8102982354
Merge: 26453b0... a263f39...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:44:59 2010 -0500
Merge branch 'master-jay' into bundle-jay
Conflicts:
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
--> Changed Criteria to use default constructor and force subclasses to
implement the getPersistentClass(); method.
diff --cc modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
index e895859,dd96d77..5d66119
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
@@@ -68,7 -68,18 +68,9 @@@ public abstract class Criteria implemen
private List<String> orderingFieldNames;
- private Class<?> persistentClass;
-
+ private String searchExpression;
+
- //added no args constructor for bean and JAXB requirement
- @SuppressWarnings("unused")
- private Criteria() {
- }
-
- public Criteria(Class<?> persistentClass) {
- this.persistentClass = persistentClass;
-
+ public Criteria() {
filterOverrides = new HashMap<String, String>();
sortOverrides = new HashMap<String, String>();
commit a263f3956b636cc2f3076f488f9db74577fa9acd
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:32:12 2010 -0500
Git LT commit
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 200a1ed..4a0e1cf 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
@@ -1,239 +1,239 @@
-<?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:rich="http://richfaces.ajax4jsf.org/rich"
- xmlns:fn="http://java.sun.com/jsp/jstl/functions"
- xmlns:onc="http://jboss.org/on/component"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:onf="http://jboss.org/on/function">
-
-THIS TEXT WILL BE REMOVED.
-
-The template for the summary section of all Resource Group pages (i.e. the Monitor/Inventory/etc. tabbed pages).
-NOTE: This template is leveraged by both Facelets pages and JSP/Tiles pages.
-
-REQUEST PARAMETERS:
-groupId - the group id of the Group being accessed
-
-<ui:composition>
-
- <h:form id="groupHeaderSummaryForm">
-
- <input type="hidden" name="groupId" value="#{ResourceGroupUIBean.groupId}"/>
- <input type="hidden" name="parentGroupId" value="#{param.parentGroupId}"/>
- <input type="hidden" name="category" value="#{param.category}"/>
-
-
-
-
-
-
-<style type="text/css">
- \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header {
- background-color: white;
- border: none;
- }
-
- \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header > .dr-stglpanel-marker {
- float: left;
- padding-left: 10px;
- }
-</style>
-
-
-<h:panelGroup layout="block" style="width: 100%; background-color: #E5E5E5;">
-
-
- <table width="100%" style="align: center; padding-top: 5px;" cellpadding="0" cellspacing="0">
- <tr>
- <td>
-
- <h:graphicImage value="/images/icons/${ResourceGroupUIBean.compatible ? 'Cluster' : 'Group' }_up_24.png"/>
- <h:outputText style="font-size: 18px;" value="#{ResourceGroupUIBean.name}"/>
-
- </td>
- <td width="30">
- <h:graphicImage value="/images/icons/availability_green_24.png" alt="Up" title="Up"
- rendered="#{ResourceGroupUIBean.availability == 1}"/>
- <h:graphicImage value="/images/icons/availability_red_24.png" alt="Down" title="Down"
- rendered="#{ResourceGroupUIBean.availability == 0}"/>
- <h:graphicImage value="/images/icons/availability_yellow_24.png" alt="Mixed" title="Mixed"
- rendered="#{ResourceGroupUIBean.availability gt 0 and ResourceGroupUIBean.availability lt 1}"/>
- <h:graphicImage value="/images/icons/availability_grey_24.png" alt="Unknown" title="Unknown"
- rendered="#{ResourceGroupUIBean.availability == null}"/>
- </td>
-
- <td width="30">
- <a4j:region>
- <h:graphicImage style="z-index: 10;" id="favoritesStar"
- value="#{ResourceGroupUIBean.favorite ? '/images/icons/Favorite_24.png' : '/images/icons/Favorite_grey_24.png'}">
- <a4j:support event="onclick"
- action="#{ResourceGroupUIBean.toggleFavorite}"
- reRender="favoritesStar, groupsMenu"
- ajaxSingle="true"
- status="commonStatus"
- disableDefault="true"/>
- </h:graphicImage>
-
-
- <rich:toolTip for="favoritesStar">
- <h:outputText value="Add resource to favorites list"
- rendered="#{!ResourceGroupUIBean.favorite}"/>
- <h:outputText value="Remove resource from favorites list"
- rendered="#{ResourceGroupUIBean.favorite}"/>
- </rich:toolTip>
- </a4j:region>
- </td>
- </tr>
- </table>
-
-
-
- </h:panelGroup>
-
- <rich:simpleTogglePanel switchType="ajax" id="summary-toggle-panel" headerClass="summaryHeader"
- actionListener="#{UserPreferencesUIBean.updateSummaryPanelDisplayState}"
- value="#{UserPreferencesUIBean.summaryPanelDisplayState}">
-
-
- <f:facet name="openMarker"><h:graphicImage value="/images/summaryHidden.png"/> </f:facet>
- <f:facet name="closeMarker"><h:graphicImage value="/images/summaryShown.png"/> </f:facet>
-
- <f:facet name="header">Summary</f:facet>
-
-
-
- <h:panelGrid columns="2" width="100%" style="padding: 3px;">
-
- <h:panelGroup layout="block" styleClass="summary-content">
-
- <!-- general properties (type, version, etc.) -->
- <h:panelGrid columns="2" styleClass="summary-props-table" style=""
- columnClasses="summary-prop-cell">
- <h:panelGroup layout="block">
- <h:outputText value="Type: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceGroupUIBean.resourceType.name}
- (#{ResourceGroupUIBean.resourceType.category.displayName})"
- rendered="#{!empty ResourceGroupUIBean.resourceType}"/>
- <h:outputText value="Mixed Types" style="font-style: italic"
- rendered="#{empty ResourceGroupUIBean.resourceType}"/>
- </h:panelGroup>
-
- <h:panelGroup layout="block">
- <h:outputText value="Description: " styleClass="BoldText"/>
- <h:outputText value="#{ResourceGroupUIBean.description}"
- rendered="#{!empty ResourceGroupUIBean.description}"/>
- <h:outputText value="none" style="font-style: italic"
- rendered="#{empty ResourceGroupUIBean.description}"/>
- </h:panelGroup>
-
-
- </h:panelGrid>
-
- <!-- spacer -->
- <h:panelGroup layout="block" style="height: 13px"/>
-
- </h:panelGroup>
-
-
- <ui:remove><!-- the blue box at the top right --></ui:remove>
- <h:panelGroup layout="block">
-
- <h:panelGrid columns="1" columnClasses="LinkBoxCell">
-
-
- </h:panelGrid>
-
- </h:panelGroup>
-
- </h:panelGrid>
-
- <ui:param name="resourceGroupMembersDataModel" value="#{ResourceGroupSummaryUIBean.dataModel}"/>
-
- <rich:dataTable id="resourceGroupMembersDataTable"
- rows="#{PageControl.MiniResourceGroupMemberList.pageSize}"
- style="width: 80%; margin-left: 10%; margin-right: 10%;"
- rendered="#{ResourceGroupUIBean.compatible}"
- value="#{resourceGroupMembersDataModel}"
- var="resourceWithAvailability"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer">
-
- <f:facet name="PageControlView">
- <onc:paginationControl id="MiniResourceGroupMemberList"/>
- </f:facet>
-
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="res.name">
- <h:outputText styleClass="headerText" value="Name"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
- <f:param name="id" value="#{resourceWithAvailability.original.resource.id}"/>
- <h:outputText value="#{resourceWithAvailability.original.resource.name}"/>
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText" value="Parent"/>
- </f:facet>
-
- <onc:resourcePartialLineage parents="#{resourceWithAvailability.parents}"/>
- </rich:column>
-
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="a.availabilityType">
- <h:outputText styleClass="headerText" value="Availability"/>
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:graphicImage value="/images/icons/availability_green_16.png" alt="Up" title="Up"
- rendered="#{resourceWithAvailability.original.availability == 'UP'}"/>
- <h:graphicImage value="/images/icons/availability_red_16.png" alt="Down" title="Down"
- rendered="#{resourceWithAvailability.original.availability == 'DOWN'}"/>
- <h:graphicImage value="/images/icons/availability_grey_16.png" alt="Unknown" title="Unknown"
- rendered="#{resourceWithAvailability.original.availability == null}"/>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="3" width="100%">
-
- <ui:param name="paginationDataTableName" value="resourceGroupMembersDataTable"/>
- <ui:param name="paginationDataModel" value="#{resourceGroupMembersDataModel}"/>
- <ui:param name="paginationPageControl" value="#{PageControl.MiniResourceGroupMemberList}"/>
- <ui:param name="paginationUIBean" value="#{ResourceGroupSummaryUIBean}"/>
- <ui:include src="/rhq/resource/include/pagination.xhtml"/>
-
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
-
- </rich:simpleTogglePanel>
-
- </h:form>
-
- <rich:spacer height="10"/>
-
-</ui:composition>
-
-THIS TEXT WILL BE REMOVED AS WELL.
-
-</html>
+<?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:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:fn="http://java.sun.com/jsp/jstl/functions"
+ xmlns:onc="http://jboss.org/on/component"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:onf="http://jboss.org/on/function">
+
+THIS TEXT WILL BE REMOVED.
+
+The template for the summary section of all Resource Group pages (i.e. the Monitor/Inventory/etc. tabbed pages).
+NOTE: This template is leveraged by both Facelets pages and JSP/Tiles pages.
+
+REQUEST PARAMETERS:
+groupId - the group id of the Group being accessed
+
+<ui:composition>
+
+ <h:form id="groupHeaderSummaryForm">
+
+ <input type="hidden" name="groupId" value="#{ResourceGroupUIBean.groupId}"/>
+ <input type="hidden" name="parentGroupId" value="#{param.parentGroupId}"/>
+ <input type="hidden" name="category" value="#{param.category}"/>
+
+
+
+
+
+
+<style type="text/css">
+ \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header {
+ background-color: white;
+ border: none;
+ }
+
+ \##{fn:replace(rich:clientId('summary-toggle-panel'),"\\:","\\\\:")}_header > .dr-stglpanel-marker {
+ float: left;
+ padding-left: 10px;
+ }
+</style>
+
+
+<h:panelGroup layout="block" style="width: 100%; background-color: #E5E5E5;">
+
+
+ <table width="100%" style="align: center; padding-top: 5px;" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+
+ <h:graphicImage value="/images/icons/${ResourceGroupUIBean.compatible ? 'Cluster' : 'Group' }_up_24.png"/>
+ <h:outputText style="font-size: 18px;" value="#{ResourceGroupUIBean.name}"/>
+
+ </td>
+ <td width="30">
+ <h:graphicImage value="/images/icons/availability_green_24.png" alt="Up" title="Up"
+ rendered="#{ResourceGroupUIBean.availability == 1}"/>
+ <h:graphicImage value="/images/icons/availability_red_24.png" alt="Down" title="Down"
+ rendered="#{ResourceGroupUIBean.availability == 0}"/>
+ <h:graphicImage value="/images/icons/availability_yellow_24.png" alt="Mixed" title="Mixed"
+ rendered="#{ResourceGroupUIBean.availability gt 0 and ResourceGroupUIBean.availability lt 1}"/>
+ <h:graphicImage value="/images/icons/availability_grey_24.png" alt="Unknown" title="Unknown"
+ rendered="#{ResourceGroupUIBean.availability == null}"/>
+ </td>
+
+ <td width="30">
+ <a4j:region>
+ <h:graphicImage style="z-index: 10;" id="favoritesStar"
+ value="#{ResourceGroupUIBean.favorite ? '/images/icons/Favorite_24.png' : '/images/icons/Favorite_grey_24.png'}">
+ <a4j:support event="onclick"
+ action="#{ResourceGroupUIBean.toggleFavorite}"
+ reRender="favoritesStar, groupsMenu"
+ ajaxSingle="true"
+ status="commonStatus"
+ disableDefault="true"/>
+ </h:graphicImage>
+
+
+ <rich:toolTip for="favoritesStar">
+ <h:outputText value="Add resource to favorites list"
+ rendered="#{!ResourceGroupUIBean.favorite}"/>
+ <h:outputText value="Remove resource from favorites list"
+ rendered="#{ResourceGroupUIBean.favorite}"/>
+ </rich:toolTip>
+ </a4j:region>
+ </td>
+ </tr>
+ </table>
+
+
+
+ </h:panelGroup>
+
+ <rich:simpleTogglePanel switchType="ajax" id="summary-toggle-panel" headerClass="summaryHeader"
+ actionListener="#{UserPreferencesUIBean.updateSummaryPanelDisplayState}"
+ value="#{UserPreferencesUIBean.summaryPanelDisplayState}">
+
+
+ <f:facet name="openMarker"><h:graphicImage value="/images/summaryHidden.png"/> </f:facet>
+ <f:facet name="closeMarker"><h:graphicImage value="/images/summaryShown.png"/> </f:facet>
+
+ <f:facet name="header">Summary</f:facet>
+
+
+
+ <h:panelGrid columns="2" width="100%" style="padding: 3px;">
+
+ <h:panelGroup layout="block" styleClass="summary-content">
+
+ <!-- general properties (type, version, etc.) -->
+ <h:panelGrid columns="2" styleClass="summary-props-table" style=""
+ columnClasses="summary-prop-cell">
+ <h:panelGroup layout="block">
+ <h:outputText value="Type: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceGroupUIBean.resourceType.name}
+ (#{ResourceGroupUIBean.resourceType.category.displayName})"
+ rendered="#{!empty ResourceGroupUIBean.resourceType}"/>
+ <h:outputText value="Mixed Types" style="font-style: italic"
+ rendered="#{empty ResourceGroupUIBean.resourceType}"/>
+ </h:panelGroup>
+
+ <h:panelGroup layout="block">
+ <h:outputText value="Description: " styleClass="BoldText"/>
+ <h:outputText value="#{ResourceGroupUIBean.description}"
+ rendered="#{!empty ResourceGroupUIBean.description}"/>
+ <h:outputText value="none" style="font-style: italic"
+ rendered="#{empty ResourceGroupUIBean.description}"/>
+ </h:panelGroup>
+
+
+ </h:panelGrid>
+
+ <!-- spacer -->
+ <h:panelGroup layout="block" style="height: 13px"/>
+
+ </h:panelGroup>
+
+
+ <ui:remove><!-- the blue box at the top right --></ui:remove>
+ <h:panelGroup layout="block">
+
+ <h:panelGrid columns="1" columnClasses="LinkBoxCell">
+
+
+ </h:panelGrid>
+
+ </h:panelGroup>
+
+ </h:panelGrid>
+
+ <ui:param name="resourceGroupMembersDataModel" value="#{ResourceGroupSummaryUIBean.dataModel}"/>
+
+ <rich:dataTable id="resourceGroupMembersDataTable"
+ rows="#{PageControl.MiniResourceGroupMemberList.pageSize}"
+ style="width: 80%; margin-left: 10%; margin-right: 10%;"
+ rendered="#{ResourceGroupUIBean.compatible}"
+ value="#{resourceGroupMembersDataModel}"
+ var="resourceWithAvailability"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer">
+
+ <f:facet name="PageControlView">
+ <onc:paginationControl id="MiniResourceGroupMemberList"/>
+ </f:facet>
+
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="res.name">
+ <h:outputText styleClass="headerText" value="Name"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputLink value="#{onf:getDefaultResourceTabURL()}">
+ <f:param name="id" value="#{resourceWithAvailability.original.resource.id}"/>
+ <h:outputText value="#{resourceWithAvailability.original.resource.name}"/>
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Parent"/>
+ </f:facet>
+
+ <onc:resourcePartialLineage parents="#{resourceWithAvailability.parents}"/>
+ </rich:column>
+
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="a.availabilityType">
+ <h:outputText styleClass="headerText" value="Availability"/>
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:graphicImage value="/images/icons/availability_green_16.png" alt="Up" title="Up"
+ rendered="#{resourceWithAvailability.original.availability == 'UP'}"/>
+ <h:graphicImage value="/images/icons/availability_red_16.png" alt="Down" title="Down"
+ rendered="#{resourceWithAvailability.original.availability == 'DOWN'}"/>
+ <h:graphicImage value="/images/icons/availability_grey_16.png" alt="Unknown" title="Unknown"
+ rendered="#{resourceWithAvailability.original.availability == null}"/>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="3" width="100%">
+
+ <ui:param name="paginationDataTableName" value="resourceGroupMembersDataTable"/>
+ <ui:param name="paginationDataModel" value="#{resourceGroupMembersDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.MiniResourceGroupMemberList}"/>
+ <ui:param name="paginationUIBean" value="#{ResourceGroupSummaryUIBean}"/>
+ <ui:include src="/rhq/resource/include/pagination.xhtml"/>
+
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+
+ </rich:simpleTogglePanel>
+
+ </h:form>
+
+ <rich:spacer height="10"/>
+
+</ui:composition>
+
+THIS TEXT WILL BE REMOVED AS WELL.
+
+</html>
commit 26453b092b345a357cbd32d9e84670cd2836e905
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:28:59 2010 -0500
git really is having trouble with these files. I have to keep committing
them due to LT issues.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
index 86182ff..2b34f6f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
@@ -1,86 +1,86 @@
-/*==================================================
- * Geochrono Unit
- *==================================================
- */
-
-Timeline.GeochronoUnit = new Object();
-
-Timeline.GeochronoUnit.MA = 0;
-Timeline.GeochronoUnit.AGE = 1;
-Timeline.GeochronoUnit.EPOCH = 2;
-Timeline.GeochronoUnit.PERIOD = 3;
-Timeline.GeochronoUnit.ERA = 4;
-Timeline.GeochronoUnit.EON = 5;
-
-Timeline.GeochronoUnit.getParser = function(format) {
- return Timeline.GeochronoUnit.parseFromObject;
-};
-
-Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
- return new Timeline.GeochronoLabeller(locale);
-};
-
-Timeline.GeochronoUnit.wrapMA = function (n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.makeDefaultValue = function () {
- return Timeline.GeochronoUnit.wrapMA(0);
-};
-
-Timeline.GeochronoUnit.cloneValue = function (v) {
- return new Timeline.GeochronoUnit._MA(v._n);
-};
-
-Timeline.GeochronoUnit.parseFromObject = function(o) {
- if (o instanceof Timeline.GeochronoUnit._MA) {
- return o;
- } else if (typeof o == "number") {
- return Timeline.GeochronoUnit.wrapMA(o);
- } else if (typeof o == "string" && o.length > 0) {
- return Timeline.GeochronoUnit.wrapMA(Number(o));
- } else {
- return null;
- }
-};
-
-Timeline.GeochronoUnit.toNumber = function(v) {
- return v._n;
-};
-
-Timeline.GeochronoUnit.fromNumber = function(n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1._n;
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2._n;
- } else {
- n2 = Number(v2);
- }
-
- return n2 - n1;
-};
-
-Timeline.GeochronoUnit.earlier = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.later = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.change = function(v, n) {
- return new Timeline.GeochronoUnit._MA(v._n - n);
-};
-
-Timeline.GeochronoUnit._MA = function(n) {
- this._n = n;
-};
-
+/*==================================================
+ * Geochrono Unit
+ *==================================================
+ */
+
+Timeline.GeochronoUnit = new Object();
+
+Timeline.GeochronoUnit.MA = 0;
+Timeline.GeochronoUnit.AGE = 1;
+Timeline.GeochronoUnit.EPOCH = 2;
+Timeline.GeochronoUnit.PERIOD = 3;
+Timeline.GeochronoUnit.ERA = 4;
+Timeline.GeochronoUnit.EON = 5;
+
+Timeline.GeochronoUnit.getParser = function(format) {
+ return Timeline.GeochronoUnit.parseFromObject;
+};
+
+Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
+ return new Timeline.GeochronoLabeller(locale);
+};
+
+Timeline.GeochronoUnit.wrapMA = function (n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.makeDefaultValue = function () {
+ return Timeline.GeochronoUnit.wrapMA(0);
+};
+
+Timeline.GeochronoUnit.cloneValue = function (v) {
+ return new Timeline.GeochronoUnit._MA(v._n);
+};
+
+Timeline.GeochronoUnit.parseFromObject = function(o) {
+ if (o instanceof Timeline.GeochronoUnit._MA) {
+ return o;
+ } else if (typeof o == "number") {
+ return Timeline.GeochronoUnit.wrapMA(o);
+ } else if (typeof o == "string" && o.length > 0) {
+ return Timeline.GeochronoUnit.wrapMA(Number(o));
+ } else {
+ return null;
+ }
+};
+
+Timeline.GeochronoUnit.toNumber = function(v) {
+ return v._n;
+};
+
+Timeline.GeochronoUnit.fromNumber = function(n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1._n;
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2._n;
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n2 - n1;
+};
+
+Timeline.GeochronoUnit.earlier = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.later = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.change = function(v, n) {
+ return new Timeline.GeochronoUnit._MA(v._n - n);
+};
+
+Timeline.GeochronoUnit._MA = function(n) {
+ this._n = n;
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
index 92027ac..46a8adf 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
@@ -144,252 +144,252 @@ Timeline.JapaneseEraDateLabeller._eras = new Timeline.SortedArray(
return e1.startingYear - e2.startingYear;
},
[
- { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
- { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
- { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
- { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
- { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
- { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
- { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
- { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
- { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
- { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
- { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
- { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
- { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
- { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
- { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
- { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
- { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
- { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
- { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
- { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
- { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
- { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
- { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
- { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
- { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
- { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
- { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
- { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
- { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
- { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
- { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
- { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
- { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
- { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
- { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
- { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
- { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
- { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
- { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
- { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
- { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
- { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
- { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
- { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
- { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
- { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
- { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
- { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
- { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
- { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
- { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
- { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
- { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
- { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
- { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
- { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
- { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
- { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
- { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
- { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
- { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
- { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
- { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
- { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
- { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
- { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
- { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
- { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
- { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
- { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
- { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
- { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
- { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
- { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
- { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
- { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
- { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
- { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
- { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
- { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
- { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
- { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
- { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
- { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
- { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
- { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
- { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
- { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
- { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
- { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
- { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
- { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
- { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
- { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
- { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
- { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
- { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
- { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
- { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
- { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
- { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
- { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
- { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
- { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
- { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
- { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
- { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
- { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
- { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
- { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
- { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
- { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
- { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
- { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
- { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
- { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
- { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
- { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
- { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
- { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
- { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
- { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
- { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
- { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
- { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
- { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
- { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
- { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
- { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
- { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
- { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
- { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
- { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
- { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
- { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
- { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
- { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
- { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
- { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
- { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
- { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
- { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
- { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
- { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
- { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
- { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
- { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
- { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
- { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
- { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
- { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
- { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
- { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
- { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
- { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
- { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
- { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
- { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
- { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
- { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
- { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
- { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
- { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
- { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
- { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
- { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
- { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
- { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
- { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
- { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
- { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
- { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
- { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
- { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
- { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
- { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
- { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
- { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
- { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
- { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
- { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
- { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
- { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
- { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
- { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
- { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
- { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
- { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
- { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
- { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
- { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
- { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
- { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
- { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
- { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
- { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
- { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
- { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
- { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
- { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
- { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
- { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
- { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
- { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
- { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
- { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
- { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
- { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
- { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
- { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
- { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
- { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
- { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
- { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
- { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
- { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
- { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
- { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
- { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
- { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
- { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
- { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
- { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
- { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
- { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
- { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
- { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
- { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
- { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
- { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
- { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
- { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
- { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
- { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
- { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
- { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
- { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
- { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
- { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
- { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
- { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
- { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
- { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
- { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
- { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
- { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
- { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
+ { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
+ { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
+ { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
+ { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
+ { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
+ { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
+ { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
+ { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
+ { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
+ { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
+ { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
+ { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
+ { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
+ { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
+ { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
+ { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
+ { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
+ { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
+ { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
+ { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
+ { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
+ { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
+ { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
+ { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
+ { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
+ { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
+ { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
+ { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
+ { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
+ { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
+ { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
+ { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
+ { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
+ { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
+ { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
+ { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
+ { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
+ { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
+ { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
+ { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
+ { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
+ { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
+ { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
+ { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
+ { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
+ { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
+ { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
+ { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
+ { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
+ { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
+ { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
+ { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
+ { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
+ { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
+ { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
+ { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
+ { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
+ { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
+ { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
+ { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
+ { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
+ { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
+ { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
+ { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
+ { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
+ { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
+ { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
+ { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
+ { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
+ { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
+ { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
+ { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
+ { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
+ { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
+ { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
+ { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
+ { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
+ { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
+ { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
+ { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
+ { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
+ { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
+ { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
+ { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
+ { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
+ { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
+ { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
+ { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
+ { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
+ { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
+ { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
+ { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
+ { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
+ { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
+ { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
+ { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
+ { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
+ { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
+ { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
+ { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
+ { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
+ { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
+ { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
+ { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
+ { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
+ { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
+ { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
+ { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
+ { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
+ { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
+ { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
+ { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
+ { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
+ { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
+ { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
+ { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
+ { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
+ { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
+ { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
+ { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
+ { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
+ { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
+ { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
+ { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
+ { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
+ { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
+ { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
+ { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
+ { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
+ { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
+ { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
+ { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
+ { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
+ { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
+ { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
+ { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
+ { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
+ { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
+ { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
+ { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
+ { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
+ { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
+ { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
+ { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
+ { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
+ { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
+ { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
+ { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
+ { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
+ { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
+ { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
+ { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
+ { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
+ { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
+ { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
+ { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
+ { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
+ { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
+ { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
+ { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
+ { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
+ { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
+ { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
+ { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
+ { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
+ { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
+ { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
+ { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
+ { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
+ { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
+ { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
+ { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
+ { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
+ { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
+ { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
+ { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
+ { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
+ { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
+ { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
+ { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
+ { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
+ { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
+ { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
+ { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
+ { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
+ { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
+ { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
+ { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
+ { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
+ { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
+ { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
+ { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
+ { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
+ { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
+ { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
+ { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
+ { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
+ { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
+ { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
+ { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
+ { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
+ { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
+ { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
+ { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
+ { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
+ { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
+ { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
+ { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
+ { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
+ { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
+ { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
+ { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
+ { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
+ { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
+ { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
+ { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
+ { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
+ { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
+ { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
+ { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
+ { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
+ { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
+ { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
+ { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
+ { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
+ { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
+ { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
+ { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
+ { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
+ { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
+ { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
+ { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
+ { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
+ { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
+ { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
+ { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
+ { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
+ { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
+ { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
+ { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
+ { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
+ { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
+ { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
+ { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
+ { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
]
);
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
index 954c7a8..caef889 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
@@ -1,30 +1,30 @@
-/*==================================================
- * Localization of labellers.js
- *==================================================
- */
-
-Timeline.GregorianDateLabeller.monthNames["cs"] = [
- "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
-];
-
-Timeline.GregorianDateLabeller.dayNames["cs"] = [
- "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
-];
-
-Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
- var text;
- var emphasized = false;
-
- var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
-
- switch(intervalUnit) {
- case Timeline.DateTime.DAY:
- case Timeline.DateTime.WEEK:
- text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
- break;
- default:
- return this.defaultLabelInterval(date, intervalUnit);
- }
-
- return { text: text, emphasized: emphasized };
-};
+/*==================================================
+ * Localization of labellers.js
+ *==================================================
+ */
+
+Timeline.GregorianDateLabeller.monthNames["cs"] = [
+ "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
+];
+
+Timeline.GregorianDateLabeller.dayNames["cs"] = [
+ "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
+];
+
+Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
+ var text;
+ var emphasized = false;
+
+ var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
+
+ switch(intervalUnit) {
+ case Timeline.DateTime.DAY:
+ case Timeline.DateTime.WEEK:
+ text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
+ break;
+ default:
+ return this.defaultLabelInterval(date, intervalUnit);
+ }
+
+ return { text: text, emphasized: emphasized };
+};
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
index d823a51..21d41a4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
@@ -1,9 +1,9 @@
-/*==================================================
- * Common localization strings
- *==================================================
- */
-
-Timeline.strings["cs"] = {
- wikiLinkLabel: "Diskuze"
-};
-
+/*==================================================
+ * Common localization strings
+ *==================================================
+ */
+
+Timeline.strings["cs"] = {
+ wikiLinkLabel: "Diskuze"
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
index 378cda1..f4ec6ae 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
@@ -3,10 +3,10 @@
*==================================================
*/
-Timeline.GregorianDateLabeller.monthNames["se"] = [
- "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
+Timeline.GregorianDateLabeller.monthNames["se"] = [
+ "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
];
-Timeline.GregorianDateLabeller.dayNames["se"] = [
- "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
+Timeline.GregorianDateLabeller.dayNames["se"] = [
+ "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
];
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
index 15ea379..00a3ff1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
@@ -1,14 +1,14 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
Timeline.NativeDateUnit = new Object();
Timeline.NativeDateUnit.createLabeller = function(locale, timeZone) {
return new Timeline.GregorianDateLabeller(locale, timeZone);
};
-
+
Timeline.NativeDateUnit.makeDefaultValue = function() {
return new Date();
};
@@ -21,15 +21,15 @@ Timeline.NativeDateUnit.getParser = function(format) {
if (typeof format == "string") {
format = format.toLowerCase();
}
- return (format == "iso8601" || format == "iso 8601") ?
- Timeline.DateTime.parseIso8601DateTime :
- Timeline.DateTime.parseGregorianDateTime;
+ return (format == "iso8601" || format == "iso 8601") ?
+ Timeline.DateTime.parseIso8601DateTime :
+ Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject = function(o) {
return Timeline.DateTime.parseGregorianDateTime(o);
};
-
+
Timeline.NativeDateUnit.toNumber = function(v) {
return v.getTime();
};
commit 7bcbdc984d9f1a37e5340bf8e0f49300a93ba082
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:28:07 2010 -0500
Added ability to generate deployment history/audits and added initial
auditing during the deployment lifecycle.
- update BundleScheduleRequest to take the BundleDeployment so the Agent
can pass it back for audit updates.
- remove the BundleUpdateStatus stuff in favor of audit/history mechanism
- add a few more bundle audit types for more granular auditing
- remove bundledeploymenthistory criteria search from the API, not currently
needed, it should be enough to search on deployments and fetch the whole
history.
-
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleRequest.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleRequest.java
index 0b49cd7..422e1f0 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleRequest.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleRequest.java
@@ -24,8 +24,10 @@
package org.rhq.core.clientapi.agent.bundle;
import java.io.Serializable;
+import java.text.DateFormat;
+import java.util.Date;
-import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
/**
* @author John Mazzitelli
@@ -33,24 +35,30 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
public class BundleScheduleRequest implements Serializable {
private static final long serialVersionUID = 1L;
- private BundleDeployDefinition bundleDeployDefinition;
+ private BundleDeployment bundleDeployment;
+ private long requestedDeployTime = System.currentTimeMillis();
- public BundleScheduleRequest(BundleDeployDefinition bundleDef) {
- this.bundleDeployDefinition = bundleDef;
+ public BundleScheduleRequest(BundleDeployment deployment) {
+ this.bundleDeployment = deployment;
}
- public BundleDeployDefinition getBundleDeployDefinition() {
- return bundleDeployDefinition;
+ public BundleDeployment getBundleDeployment() {
+ return bundleDeployment;
}
- public void setBundleDeployDefinition(BundleDeployDefinition bundleDeployDefinition) {
- this.bundleDeployDefinition = bundleDeployDefinition;
+ /** In ms */
+ public Long getRequestedDeployTime() {
+ return requestedDeployTime;
+ }
+
+ public String getRequestedDeployTimeAsString() {
+ return DateFormat.getInstance().format(new Date(requestedDeployTime));
}
@Override
public String toString() {
StringBuilder str = new StringBuilder(this.getClass() + ": ");
- str.append(bundleDeployDefinition.toString());
+ str.append(bundleDeployment.toString());
return str.toString();
}
}
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java
index dbc0555..d248fc2 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleServerService.java
@@ -29,6 +29,7 @@ import org.rhq.core.clientapi.server.content.ContentServerService;
import org.rhq.core.communications.command.annotation.Asynchronous;
import org.rhq.core.communications.command.annotation.LimitedConcurrency;
import org.rhq.core.communications.command.annotation.Timeout;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.content.PackageVersion;
/**
@@ -40,7 +41,7 @@ import org.rhq.core.domain.content.PackageVersion;
public interface BundleServerService {
@Asynchronous(guaranteedDelivery = true)
- void updateStatus(BundleStatusUpdate update);
+ void addDeploymentHistory(int bundleDeploymentId, BundleDeploymentHistory history);
List<PackageVersion> getAllBundleVersionPackageVersions(int bundleVersionId);
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleStatusUpdate.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleStatusUpdate.java
deleted file mode 100644
index 99bdda8..0000000
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/server/bundle/BundleStatusUpdate.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.rhq.core.clientapi.server.bundle;
-
-/**
- * Object that informs the server that a bundle deployment has a new status.
- * This will be the way the bundle deployment process is tracked.
- *
- * @author John Mazzitelli
- */
-public class BundleStatusUpdate {
-
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
index 588bda6..45389af 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeployment.java
@@ -110,6 +110,10 @@ public class BundleDeployment implements Serializable {
return resource;
}
+ public void setResource(Resource resource) {
+ this.resource = resource;
+ }
+
public Long getCtime() {
return ctime;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentAction.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentAction.java
index b066354..9aa8e6c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentAction.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentAction.java
@@ -29,6 +29,10 @@ package org.rhq.core.domain.bundle;
*/
public enum BundleDeploymentAction {
+ DEPLOYMENT_REQUESTED, //
+ DEPLOYMENT_SCHEDULED, //
+ FILE_DOWNLOAD_START, //
+ FILE_DOWNLOAD_END, //
DEPLOYMENT_START, //
DEPLOYMENT_END, //
POLICY_CHECK_FAIL
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
index a1f370c..7e8648d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
@@ -83,18 +83,15 @@ public class BundleDeploymentHistory implements Serializable {
protected BundleDeploymentHistory() {
}
- public BundleDeploymentHistory(BundleDeployment bundleDeployment, String subjectName, Long auditTime,
- BundleDeploymentAction auditAction, String auditMessage) {
+ public BundleDeploymentHistory(String subjectName, BundleDeploymentAction auditAction, String auditMessage) {
- this.bundleDeployment = bundleDeployment;
this.subjectName = subjectName;
- this.auditTime = auditTime;
this.auditAction = auditAction;
this.auditMessage = auditMessage;
}
public int getId() {
- return id;
+ return this.id;
}
public void setId(int id) {
@@ -102,7 +99,7 @@ public class BundleDeploymentHistory implements Serializable {
}
public BundleDeployment getBundleDeployment() {
- return bundleDeployment;
+ return this.bundleDeployment;
}
public void setBundleDeployment(BundleDeployment bundleDeployment) {
@@ -118,7 +115,7 @@ public class BundleDeploymentHistory implements Serializable {
}
public Long getAuditTime() {
- return auditTime;
+ return this.auditTime;
}
public void setAuditTime(Long auditTime) {
@@ -126,7 +123,7 @@ public class BundleDeploymentHistory implements Serializable {
}
public BundleDeploymentAction getAuditAction() {
- return auditAction;
+ return this.auditAction;
}
public void setAuditAction(BundleDeploymentAction auditAction) {
@@ -134,7 +131,7 @@ public class BundleDeploymentHistory implements Serializable {
}
public String getAuditMessage() {
- return auditMessage;
+ return this.auditMessage;
}
public void setAuditMessage(String auditMessage) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
deleted file mode 100644
index 094152a..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.core.domain.criteria;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
-
-/**
- * @author Adam Young
- */
-@XmlRootElement
-(a)XmlAccessorType(XmlAccessType.FIELD)
-public class BundleDeploymentHistoryCriteria extends Criteria {
-
- private static final long serialVersionUID = 747793536546442610L;
-
- //No reason to make these private. The setters are necessary to work with bean-api mechanisms
- public Integer filterId;
- public Integer filterPlatformResourceId;
- public Integer filterBundleId;
- public Integer filterBundleDeploymentId;
- public Integer filterBundleDeploymentDefinitionId;
-
- public BundleDeploymentHistoryCriteria() {
- super();
-
- }
-
- public Class<BundleDeploymentHistory> getPersistentClass() {
- return BundleDeploymentHistory.class;
- }
-
- public void setFilterId(Integer filterId) {
- this.filterId = filterId;
- }
-
- public void setFilterPlatformResourceId(Integer filterPlatformResourceId) {
- this.filterPlatformResourceId = filterPlatformResourceId;
- }
-
- public void setFilterBundleId(Integer filterBundleId) {
- this.filterBundleId = filterBundleId;
- }
-
- public void setFilterBundleDeploymentId(Integer filterBundleDeploymentId) {
- this.filterBundleDeploymentId = filterBundleDeploymentId;
- }
-
- public void setFilterBundleDeploymentDefinitionId(Integer filterBundleDeploymentDefinitionId) {
- this.filterBundleDeploymentDefinitionId = filterBundleDeploymentDefinitionId;
- }
-
-}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index 9bba46d..798db91 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -40,6 +40,9 @@ import org.rhq.core.clientapi.agent.bundle.BundleScheduleRequest;
import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.clientapi.server.bundle.BundleServerService;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentAction;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.content.PackageVersion;
@@ -101,7 +104,8 @@ public class BundleManager extends AgentService implements BundleAgentService, B
BundleScheduleResponse response = new BundleScheduleResponse();
try {
- BundleDeployDefinition bundleDeployDef = request.getBundleDeployDefinition();
+ BundleDeployment deployment = request.getBundleDeployment();
+ BundleDeployDefinition bundleDeployDef = deployment.getBundleDeployDefinition();
// find the resource that will handle the bundle processing
InventoryManager im = PluginContainer.getInstance().getInventoryManager();
@@ -113,26 +117,32 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
int bundleHandlerResourceId = resources.iterator().next().getId();
+ auditDeployment(deployment, BundleDeploymentAction.DEPLOYMENT_SCHEDULED, "Scheduled deployment time: "
+ + request.getRequestedDeployTimeAsString() + " (immediate)");
+
// pull down the bundle files that the plugin will need in order to process the bundle
ResourceContainer resourceContainer = im.getResourceContainer(bundleHandlerResourceId);
File pluginTmpDir = resourceContainer.getResourceContext().getTemporaryDirectory();
File bundleFilesDir = new File(pluginTmpDir, "" + bundleDeployDef.getBundleVersion().getId());
- Map<PackageVersion, File> downloadedFiles = downloadBundleFiles(bundleDeployDef, bundleFilesDir);
+ Map<PackageVersion, File> downloadedFiles = downloadBundleFiles(deployment, bundleFilesDir);
// get the bundle facet object that will process the bundle
int facetMethodTimeout = 4 * 60 * 60 * 1000; // 4 hours is given to the bundle plugin to do its thing
BundleFacet bundlePluginComponent = getBundleFacet(bundleHandlerResourceId, facetMethodTimeout);
// deploy the bundle utilizing the bundle facet object
+ auditDeployment(deployment, BundleDeploymentAction.DEPLOYMENT_START, null);
+
BundleDeployRequest deployRequest = new BundleDeployRequest();
deployRequest.setBundleManagerProvider(this);
- deployRequest.setBundleDeployDefinition(request.getBundleDeployDefinition());
+ deployRequest.setBundleDeployDefinition(bundleDeployDef);
deployRequest.setBundleFilesLocation(bundleFilesDir);
deployRequest.setPackageVersionFiles(downloadedFiles);
BundleDeployResult result = bundlePluginComponent.deployBundle(deployRequest);
if (!result.isSuccess()) {
response.setErrorMessage(result.getErrorMessage());
}
+ auditDeployment(deployment, BundleDeploymentAction.DEPLOYMENT_END, "Success");
} catch (Throwable t) {
log.error("Failed to schedule bundle request: " + request, t);
response.setErrorMessage(t);
@@ -149,12 +159,15 @@ public class BundleManager extends AgentService implements BundleAgentService, B
* @return map of the package versions to their files that were downloaded
* @throws Exception
*/
- private Map<PackageVersion, File> downloadBundleFiles(BundleDeployDefinition bundleDeployDef, File downloadDir)
+ private Map<PackageVersion, File> downloadBundleFiles(BundleDeployment deployment, File downloadDir)
throws Exception {
+ BundleDeployDefinition bundleDeployDef = deployment.getBundleDeployDefinition();
BundleVersion bundleVersion = bundleDeployDef.getBundleVersion();
// download all the bundle files to the bundle plugin's tmp directory
+ auditDeployment(deployment, BundleDeploymentAction.FILE_DOWNLOAD_START, null);
+
Map<PackageVersion, File> packageVersionFiles = new HashMap<PackageVersion, File>();
List<PackageVersion> packageVersions = getAllBundleVersionPackageVersions(bundleVersion);
for (PackageVersion packageVersion : packageVersions) {
@@ -183,9 +196,16 @@ public class BundleManager extends AgentService implements BundleAgentService, B
packageVersionFiles.put(packageVersion, packageFile);
}
+ auditDeployment(deployment, BundleDeploymentAction.FILE_DOWNLOAD_END, null);
+
return packageVersionFiles;
}
+ private void auditDeployment(BundleDeployment deployment, BundleDeploymentAction action, String message) {
+ BundleDeploymentHistory history = new BundleDeploymentHistory("Bundle Plugin", action, message);
+ getBundleServerService().addDeploymentHistory(deployment.getId(), history);
+ }
+
/**
* Checks to see if the package file's hash matches that of the given package version.
* If the file doesn't exist or the hash doesn't match, an exception is thrown.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index be5a070..ce985e8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -22,9 +22,7 @@ import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
-import java.util.Random;
import java.util.Set;
-import java.util.UUID;
import javax.ejb.EJB;
import javax.ejb.Stateless;
@@ -46,6 +44,7 @@ import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
@@ -60,7 +59,6 @@ import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Resource;
@@ -75,7 +73,6 @@ import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
-import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.enterprise.server.util.HibernateDetachUtility;
@@ -109,15 +106,20 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
@EJB
private RepoManagerLocal repoManager;
- @EJB
- private ResourceTypeManagerLocal resourceTypeManager;
-
- // TODO: I don't think this is adequate, need to link to the deployment
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public void addBundleDeploymentHistoryByBundleDeployment(Subject subject, BundleDeploymentHistory history)
- throws Exception {
+ public BundleDeploymentHistory addBundleDeploymentHistory(Subject subject, int bundleDeploymentId,
+ BundleDeploymentHistory history) throws Exception {
- entityManager.persist(history);
+ BundleDeployment deployment = entityManager.find(BundleDeployment.class, bundleDeploymentId);
+ if (null == deployment) {
+ throw new IllegalArgumentException("Invalid bundleDeploymentId: " + bundleDeploymentId);
+ }
+
+ deployment.addBundleDeploymentHistory(history);
+ this.entityManager.persist(deployment);
+
+ return history;
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
@@ -371,13 +373,14 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resourceId);
}
- // requires_new trans
- BundleDeployment deployment = bundleManager.createBundleDeployment(subject, bundleDeployDefinitionId,
- resourceId);
-
AgentClient agentClient = agentManager.getAgentClient(resourceId);
BundleAgentService bundleAgentService = agentClient.getBundleAgentService();
- // make sure the deployDef contains the info required by the schedule service
+
+ // The BundleDeployment record must exist in the db before the agent request because the agent may try to
+ // add History to it during immediate deployments., so create and persist it (requires a new trans).
+ BundleDeployment deployment = bundleManager.createBundleDeployment(subject, deployDef.getId(), resourceId);
+
+ // make sure the deployment contains the info required by the schedule service
BundleVersion bundleVersion = entityManager.find(BundleVersion.class, deployDef.getBundleVersion().getId());
Configuration config = entityManager.find(Configuration.class, deployDef.getConfiguration().getId());
Bundle bundle = entityManager.find(Bundle.class, bundleVersion.getBundle().getId());
@@ -388,15 +391,32 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
bundleVersion.setBundle(bundle);
deployDef.setBundleVersion(bundleVersion);
deployDef.setConfiguration(config);
+ deployment.setBundleDeployDefinition(deployDef);
+ deployment.setResource(resource);
+
// now scrub the hibernate entity to make it a pojo suitable for sending to the client
- HibernateDetachUtility.nullOutUninitializedFields(deployDef, SerializationType.SERIALIZATION);
- BundleScheduleRequest request = new BundleScheduleRequest(deployDef);
+ HibernateDetachUtility.nullOutUninitializedFields(deployment, SerializationType.SERIALIZATION);
+
+ BundleScheduleRequest request = new BundleScheduleRequest(deployment);
+
+ // add the deployment request history (in a new trans)
+ BundleDeploymentHistory history = new BundleDeploymentHistory(subject.getName(),
+ BundleDeploymentAction.DEPLOYMENT_REQUESTED, "Requested deployment time: "
+ + request.getRequestedDeployTimeAsString());
+ bundleManager.addBundleDeploymentHistory(subject, deployment.getId(), history);
+
+ // Ask the agent to schedule the request. The agent should add history as needed.
BundleScheduleResponse response = bundleAgentService.schedule(request);
// we don't want to commit the scrubbed entities so clear the changes
this.entityManager.clear();
- // TODO: Generate History based on the response
+ // Add any more history as needed
+ if (!response.isSuccess()) {
+ history = new BundleDeploymentHistory(subject.getName(), BundleDeploymentAction.DEPLOYMENT_END, "Failure: "
+ + response.getErrorMessage());
+ bundleManager.addBundleDeploymentHistory(subject, deployment.getId(), history);
+ }
return deployment;
}
@@ -416,9 +436,8 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
BundleDeployment deployment = new BundleDeployment(deployDef, resource);
- deployDef.addDeployment(deployment);
- entityManager.persist(deployment);
+ entityManager.persist(deployment);
return deployment;
}
@@ -499,17 +518,6 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return queryRunner.execute();
}
- // TODO: I don't think this criteria search is necessary
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
- BundleDeploymentHistoryCriteria criteria) {
-
- CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
-
- CriteriaQueryRunner<BundleDeploymentHistory> queryRunner = new CriteriaQueryRunner<BundleDeploymentHistory>(
- criteria, generator, entityManager);
- return queryRunner.execute();
- }
-
public PageList<BundleVersion> findBundleVersionsByCriteria(Subject subject, BundleVersionCriteria criteria) {
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
@@ -564,48 +572,4 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// the deployments.
this.entityManager.remove(bundleVersion);
}
-
- public BundleType createMockBundleType(Subject subject) {
-
- try {
- ResourceType linuxPlatformResourceType = this.resourceTypeManager.getResourceTypeByNameAndPlugin("Linux",
- "Platforms");
- return createBundleType(subject, UUID.randomUUID().toString(), linuxPlatformResourceType.getId());
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
-
- public Bundle createMockBundle(Subject subject, List<BundleType> bundleTypes) throws Exception {
- Random random = new Random();
- BundleType bundleType;
- if (bundleTypes.isEmpty()) {
- bundleType = createMockBundleType(subject);
- } else {
- int randomIndex = random.nextInt(bundleTypes.size());
- bundleType = bundleTypes.get(randomIndex);
- }
-
- Bundle bundle = createBundle(subject, UUID.randomUUID().toString(), bundleType.getId());
-
- // Add 1 to 5 bundle versions.
- int bundleVersionCount = random.nextInt(5) + 1;
- for (int i = 0; i < bundleVersionCount; i++) {
- String bundleVersionName = UUID.randomUUID().toString();
- final String RECIPE = "repo rhel-x86_64-5\n" //
- + "package foo-1.25.rpm\n" //
- + "package bar-1.25.rpm\n" //
- + "script foo.bash -c some parameter\n" //
- + "deploy jboss.tar %{jboss.home.directory}\n" //
- + "realize %{jboss.home.directory}/server/default/setting.xml\n" //
- + "file example.setting /etc/some/setting.ini\n" + "service example restart\n";
- BundleVersion bundleVersion = new BundleVersion(bundleVersionName, String.valueOf(i + 1), null, RECIPE);
- bundle.addBundleVersion(bundleVersion);
- }
-
- bundle = entityManager.merge(bundle);
- return bundle;
- }
-
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index df7758a..efca190 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@ -41,13 +41,16 @@ public interface BundleManagerLocal extends BundleManagerRemote {
// - legacy reasons
/**
- * Called internally to add history when action is taken against a deployment.
+ * Called internally to add history when action is taken against a deployment. This executes
+ * in a New Transaction and supports deployBundle and Agent requests.
*
* @param subject
+ * @param bundleDeploymentId id of the deployment appending the history record
* @param history
+ * @return the persisted history
*/
- void addBundleDeploymentHistoryByBundleDeployment(Subject subject, BundleDeploymentHistory history)
- throws Exception;
+ BundleDeploymentHistory addBundleDeploymentHistory(Subject subject, int bundleDeploymentId,
+ BundleDeploymentHistory history) throws Exception;
/**
* Not generally called. For use by Server Side Plugins when registering a Bundle Plugin.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 5b5f89e..ac0bb4d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -32,7 +32,6 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -41,7 +40,6 @@ import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
@@ -200,13 +198,6 @@ public interface BundleManagerRemote {
@WebParam(name = "BundleDeploymentCriteria") BundleDeploymentCriteria criteria);
@WebMethod
- // TODO is this necessary? Or do you just search for deployments and optionally fetch the history?
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(
- //
- @WebParam(name = "subject") Subject subject,
- @WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
-
- @WebMethod
PageList<BundleFile> findBundleFilesByCriteria( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "criteria") BundleFileCriteria criteria);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
index c79e585..afda193 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
@@ -26,8 +26,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.clientapi.server.bundle.BundleServerService;
-import org.rhq.core.clientapi.server.bundle.BundleStatusUpdate;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.criteria.BundleFileCriteria;
@@ -48,8 +48,14 @@ import org.rhq.enterprise.server.util.HibernateDetachUtility.SerializationType;
public class BundleServerServiceImpl implements BundleServerService {
private final Log log = LogFactory.getLog(this.getClass());
- public void updateStatus(BundleStatusUpdate update) {
- // TODO Auto-generated method stub
+ public void addDeploymentHistory(int bundleDeploymentId, BundleDeploymentHistory history) {
+ try {
+ BundleManagerLocal bm = LookupUtil.getBundleManager();
+ bm.addBundleDeploymentHistory(LookupUtil.getSubjectManager().getOverlord(), bundleDeploymentId, history);
+ } catch (Exception e) {
+ log.error("Failed to add history to deployment id: " + bundleDeploymentId, e);
+ throw new WrappedRemotingException(e);
+ }
}
public List<PackageVersion> getAllBundleVersionPackageVersions(int bundleVersionId) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index c62bf55..5c00627 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -41,7 +41,6 @@ import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -77,7 +76,6 @@ import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.criteria.Criteria;
@@ -378,11 +376,6 @@ public class WebservicesManagerBean implements WebservicesRemote {
return bundleManager.findBundleDeployDefinitionsByCriteria(subject, criteria);
}
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
- BundleDeploymentHistoryCriteria criteria) {
- return bundleManager.findBundleDeploymentHistoryByCriteria(subject, criteria);
- }
-
public PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria) {
return bundleManager.findBundleDeploymentsByCriteria(subject, criteria);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index f331210..f00eb14 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -20,7 +20,6 @@
package org.rhq.enterprise.server.bundle;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import java.util.Set;
@@ -39,7 +38,6 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
-import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
@@ -51,7 +49,6 @@ import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.InventoryStatus;
@@ -451,32 +448,6 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assertNotNull(null);
}
- @Test(enabled = DISABLED)
- public void testFindHistoryByCriteria() throws Exception {
-
- Long auditTime = new Date().getTime();
- BundleDeploymentAction auditAction = BundleDeploymentAction.DEPLOYMENT_START;
- String auditMessage = "This is my message";
-
- BundleDeployment bundleDeployment = createDeployment();
- BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, overlord.getName(), auditTime,
- auditAction, auditMessage);
-
- Bundle bundle = createBundle("deleteThisBundle");
-
- history.setBundleDeployment(bundleDeployment);
-
- bundleManager.addBundleDeploymentHistoryByBundleDeployment(overlord, history);
-
- BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
- List<BundleDeploymentHistory> histories = bundleManager.findBundleDeploymentHistoryByCriteria(overlord,
- criteria);
-
- assertNotNull(histories);
- assertTrue(histories.size() > 0);
-
- }
-
private BundleDeployment createDeployment() {
Resource resource = new Resource();
commit 77ef7d9b900182c4a48babdacdd612bd0eb0bfe6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:18:21 2010 -0500
New test script that generates test users. Can be used to easily generate
a bunch of test users when we want a bunch of different folks logged in
for testing concurrent user stuff.
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_subjectManagerUserCreate.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_subjectManagerUserCreate.js
new file mode 100644
index 0000000..b87fdc3
--- /dev/null
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_subjectManagerUserCreate.js
@@ -0,0 +1,116 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * By default generates users jon1..jon20 and assigns them to the "All Resources Role". Existing users
+ * with a generated name will be deleted and recreated.
+ *
+ * This test script creates test users on the server running at localhost 7080. To affect a different
+ * database change the variables:
+ * testHost
+ * testPort
+ *
+ * To change the assigned Role change the variable:
+ * testRole
+ *
+ * To change the username or number of generated users change the variables:
+ * testUsername
+ * testCount
+ *
+ * To change the default required field values change the variables:
+ * testEmail
+ * testFirst
+ * testLast
+ * testPassword
+ */
+
+var testHost = 'localhost';
+var testPort = '7080';
+
+var testRole = 'All Resources Role';
+
+var testUsername = 'jon';
+var testCount = 20;
+
+var testEmail = 'test(a)test.com';
+var testFirst = 'test';
+var testLast = 'user';
+var testPassword = 'redhat';
+
+
+var TestsEnabled = true;
+
+var subject = rhq.login('rhqadmin', 'rhqadmin', testHost, testPort);
+
+executeAllTests();
+
+rhq.logout();
+
+function testUserCreation() {
+ if ( !TestsEnabled ) {
+ return;
+ }
+
+ var c = new RoleCriteria();
+ c.addFilterName( testRole );
+ var roles = RoleManager.findRolesByCriteria( c );
+ Assert.assertTrue( (1 == roles.size()), "testRole should exist");
+ Assert.assertEquals(testRole, roles.get(0).getName());
+ var role = roles.get(0);
+ var rolesArray = new Array(1);
+ rolesArray[0] = role.getId();
+
+ c = new SubjectCriteria();
+ c.setStrict( true );
+ c.fetchRoles( true );
+ var newSubject = new Subject();
+ newSubject.setEmailAddress( testEmail );
+ newSubject.setFirstName( testFirst );
+ newSubject.setLastName( testLast );
+ newSubject.setFactive(true);
+ newSubject.setFsystem(false);
+
+ for( i=1; i <= testCount; ++i ) {
+ var newUsername = testUsername + i;
+ c.addFilterName( newUsername );
+ var users = SubjectManager.findSubjectsByCriteria(c);
+ if ( !users.isEmpty() ) {
+ print( "\n recreating existing user: " + newUsername );
+ var subjectArray = new Array(1);
+ subjectArray[0] = users.get(0).getId();
+ SubjectManager.deleteSubjects( subjectArray );
+ users = SubjectManager.findSubjectsByCriteria(c);
+ Assert.assertTrue( users.isEmpty() );
+ }
+
+ newSubject.setName( newUsername );
+ var s = SubjectManager.createSubject( newSubject );
+ Assert.assertNotNull( s );
+ SubjectManager.createPrincipal( newUsername, testPassword );
+ RoleManager.addRolesToSubject( s.getId(), rolesArray );
+ users = SubjectManager.findSubjectsByCriteria(c);
+ Assert.assertEquals( 1, users.size() );
+ Assert.assertTrue( ( 1 == users.get(0).getRoles().size()));
+ Assert.assertTrue( users.get(0).getRoles().contains( role ) );
+ }
+}
commit 6a6e98ad760c3351a4f2e2b1d8fe801ec8c17317
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:16:36 2010 -0500
Fix problem with Subject-as-first-param logic that was hiding API methods
that happened to have Subject as the second param
(createSubject, updateSubject)
Add Suppress unchecked warnings class-wide to remove many warnings.
diff --git a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/InteractiveJavascriptCompletor.java b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/InteractiveJavascriptCompletor.java
index 7dc42bc..e4acabf 100644
--- a/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/InteractiveJavascriptCompletor.java
+++ b/modules/enterprise/remoting/cli/src/main/java/org/rhq/enterprise/client/InteractiveJavascriptCompletor.java
@@ -18,35 +18,32 @@
*/
package org.rhq.enterprise.client;
-import jline.Completor;
-import jline.ConsoleReader;
-import jline.ANSIBuffer;
-
-import javax.jws.WebParam;
-import javax.script.Bindings;
-import javax.script.ScriptContext;
import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.Collections;
-import org.rhq.enterprise.client.utility.ReflectionUtility;
+import javax.jws.WebParam;
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+
+import jline.Completor;
+import jline.ConsoleReader;
+
import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.client.utility.ReflectionUtility;
/**
* A Contextual JavaScript interactive completor. Not perfect, but
@@ -54,6 +51,7 @@ import org.rhq.core.domain.auth.Subject;
*
* @author Greg Hinkle
*/
+@SuppressWarnings("unchecked")
public class InteractiveJavascriptCompletor implements Completor {
private Map<String, Object> services;
@@ -103,7 +101,6 @@ public class InteractiveJavascriptCompletor implements Completor {
lastComplete = s;
-
String base = s;
int rootLength = 0;
@@ -113,16 +110,14 @@ public class InteractiveJavascriptCompletor implements Completor {
rootLength = s.length() - base.length();
}
-
String[] call = base.split("\\.");
if (base.endsWith(".")) {
- String[] argPadded = new String[call.length+1];
+ String[] argPadded = new String[call.length + 1];
System.arraycopy(call, 0, argPadded, 0, call.length);
argPadded[call.length] = "";
call = argPadded;
}
-
if (call.length == 1) {
Map<String, Object> matches = getContextMatches(call[0]);
if (matches.size() == 1 && matches.containsKey(call[0]) && !s.endsWith(".")) {
@@ -144,7 +139,6 @@ public class InteractiveJavascriptCompletor implements Completor {
Collections.sort(list);
-
return (list.size() == 0) ? (-1) : rootLength;
} catch (Exception e) {
e.printStackTrace();
@@ -152,7 +146,6 @@ public class InteractiveJavascriptCompletor implements Completor {
}
}
-
/**
* Base Object can be an object where we're looking for methods on it, or an
* interface. This recursively works off the completions left to right.
@@ -175,7 +168,7 @@ public class InteractiveJavascriptCompletor implements Completor {
* @return location of relative completion
*/
public int contextComplete(Object baseObject, String s, int i, List list) {
- String temp = s.split("\\(",2)[0];
+ String temp = s.split("\\(", 2)[0];
if (temp.contains(".")) {
String[] call = temp.split("\\.", 2);
@@ -184,26 +177,17 @@ public class InteractiveJavascriptCompletor implements Completor {
next = next.substring(0, next.indexOf("("));
}
- Class baseObjectClass = null;
- if (baseObject instanceof Class) {
- baseObjectClass = (Class) baseObject;
- } else {
- baseObjectClass = baseObject.getClass();
- }
-
-
- Map<String, List<Object>> matches = getContextMatches(baseObjectClass, next);
+ Map<String, List<Object>> matches = getContextMatches(baseObject, next);
if (!matches.isEmpty()) {
Object rootObject = matches.get(next).get(0);
if (rootObject instanceof PropertyDescriptor && !(baseObject instanceof Class)) {
try {
- rootObject = invoke(baseObject, ((PropertyDescriptor)rootObject).getReadMethod());
+ rootObject = invoke(baseObject, ((PropertyDescriptor) rootObject).getReadMethod());
} catch (Exception e) {
e.printStackTrace();
}
} else if (rootObject instanceof Method) {
- rootObject =
- ((Method)rootObject).getReturnType();
+ rootObject = ((Method) rootObject).getReturnType();
}
return call[0].length() + 1 + contextComplete(rootObject, call[1], i, list);
@@ -213,8 +197,7 @@ public class InteractiveJavascriptCompletor implements Completor {
} else {
String[] call = s.split("\\(", 2);
- Map<String, List<Object>> matches = getContextMatches(baseObject instanceof Class ? ((Class) baseObject) : baseObject.getClass(), call[0]);
-
+ Map<String, List<Object>> matches = getContextMatches(baseObject, call[0]);
if (call.length == 2 && matches.containsKey(call[0])) {
@@ -238,7 +221,7 @@ public class InteractiveJavascriptCompletor implements Completor {
if (key.equals(call[0]) && match instanceof Method) {
- int result = completeParameters(baseObject, call[1], i, list, (Method) match); // x should be the same for all calls
+ int result = completeParameters(baseObject, call[1], i, list, (Method) match); // x should be the same for all calls
if (result > 0) {
x = result;
}
@@ -250,7 +233,7 @@ public class InteractiveJavascriptCompletor implements Completor {
if (matches.size() == 1 && matches.containsKey(call[0])) {
if (matches.get(call[0]).get(0) instanceof Method) {
- list.add("(" + (((Method)matches.get(call[0]).get(0)).getParameterTypes().length == 0 ? ")" : ""));
+ list.add("(" + (((Method) matches.get(call[0]).get(0)).getParameterTypes().length == 0 ? ")" : ""));
}
return call[0].length() + 1;
}
@@ -264,10 +247,13 @@ public class InteractiveJavascriptCompletor implements Completor {
}
}
}
- displaySignatures(baseObject,methods.toArray(new Method[methods.size()]));
+ displaySignatures(baseObject, methods.toArray(new Method[methods.size()]));
} else {
if (matches.size() == 1 && matches.values().iterator().next().get(0) instanceof Method) {
- list.add(matches.keySet().iterator().next() + "(" + ((((Method)matches.values().iterator().next().get(0)).getParameterTypes().length == 0 ? ")" : "")));
+ list.add(matches.keySet().iterator().next()
+ + "("
+ + ((((Method) matches.values().iterator().next().get(0)).getParameterTypes().length == 0 ? ")"
+ : "")));
} else {
list.addAll(matches.keySet());
}
@@ -280,8 +266,7 @@ public class InteractiveJavascriptCompletor implements Completor {
private void displaySignatures(Object object, Method... methods) {
try {
String start = this.consoleReader.getCursorBuffer().getBuffer().toString();
- while ((this.consoleReader.getCursorBuffer().cursor > 0)
- && this.consoleReader.backspace()) {
+ while ((this.consoleReader.getCursorBuffer().cursor > 0) && this.consoleReader.backspace()) {
;
}
this.consoleReader.printNewline();
@@ -289,7 +274,7 @@ public class InteractiveJavascriptCompletor implements Completor {
String[][] signatures = new String[methods.length][];
int i = 0;
for (Method m : methods) {
- signatures[i++] = getSignature(object,m).split(" ", 2);
+ signatures[i++] = getSignature(object, m).split(" ", 2);
}
int maxReturnLength = 0;
@@ -299,7 +284,7 @@ public class InteractiveJavascriptCompletor implements Completor {
}
for (String[] sig : signatures) {
- for (i = 0; i < (maxReturnLength - sig[0].length()); i++ ) {
+ for (i = 0; i < (maxReturnLength - sig[0].length()); i++) {
this.consoleReader.printString(" ");
}
@@ -309,7 +294,6 @@ public class InteractiveJavascriptCompletor implements Completor {
this.consoleReader.printNewline();
}
-
this.consoleReader.drawLine();
this.consoleReader.putString(start);
} catch (Exception e) {
@@ -317,7 +301,6 @@ public class InteractiveJavascriptCompletor implements Completor {
}
}
-
/**
* Split apart the parameters to a method call and complete the last parameter. If the last
* paramater has a valid value close that field with a "," for the next param or a ")" if is
@@ -335,7 +318,6 @@ public class InteractiveJavascriptCompletor implements Completor {
String[] paramList = params.split(",");
-
Class[] c = method.getParameterTypes();
String lastParam = paramList[paramList.length - 1];
@@ -356,7 +338,6 @@ public class InteractiveJavascriptCompletor implements Completor {
baseLength += paramList[x].length() + 1;
}
-
if (paramIndex >= c.length) {
if (params.endsWith(")")) {
return -1;
@@ -368,14 +349,14 @@ public class InteractiveJavascriptCompletor implements Completor {
if (baseObject instanceof Map && method.getName().equals("get") && method.getParameterTypes().length == 1) {
Class keyType = method.getParameterTypes()[0];
- for (Object key : ((Map)baseObject).keySet()) {
+ for (Object key : ((Map) baseObject).keySet()) {
String lookupChoice = "\'" + String.valueOf(key) + "\'";
if (lookupChoice.startsWith(lastParam)) {
list.add(lookupChoice);
}
}
if (list.size() == 1) {
- list.set(0,list.get(0) + ")");
+ list.set(0, list.get(0) + ")");
}
} else {
@@ -396,7 +377,6 @@ public class InteractiveJavascriptCompletor implements Completor {
}
}
-
private Map<String, Object> getContextMatches(String start) {
Map<String, Object> found = new HashMap<String, Object>();
if (context != null) {
@@ -419,7 +399,6 @@ public class InteractiveJavascriptCompletor implements Completor {
return found;
}
-
/**
* Look through all available contexts to find bindings that both start with
* the supplied start and match the typeFilter.
@@ -436,7 +415,7 @@ public class InteractiveJavascriptCompletor implements Completor {
if (var.startsWith(start)) {
if ((bindings.get(var) != null && typeFilter.isAssignableFrom(bindings.get(var).getClass()))
- || recomplete == 3) {
+ || recomplete == 3) {
found.put(var, bindings.get(var));
}
}
@@ -456,11 +435,16 @@ public class InteractiveJavascriptCompletor implements Completor {
return found;
}
-
-
- private Map<String, List<Object>> getContextMatches(Class baseObjectClass, String start) {
+ private Map<String, List<Object>> getContextMatches(Object baseObject, String start) {
Map<String, List<Object>> found = new HashMap<String, List<Object>>();
+ Class baseObjectClass = null;
+ if (baseObject instanceof Class) {
+ baseObjectClass = (Class) baseObject;
+ } else {
+ baseObjectClass = baseObject.getClass();
+ }
+
try {
if (baseObjectClass.equals(Void.TYPE))
return found;
@@ -476,13 +460,12 @@ public class InteractiveJavascriptCompletor implements Completor {
PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
for (PropertyDescriptor desc : descriptors) {
- if (desc.getName().startsWith(start)
- && (!IGNORED_METHODS.contains(desc.getName()))) {
+ if (desc.getName().startsWith(start) && (!IGNORED_METHODS.contains(desc.getName()))) {
List list = found.get(desc.getName());
if (list == null) {
list = new ArrayList();
- found.put(desc.getName(),list);
+ found.put(desc.getName(), list);
}
list.add(desc);
@@ -493,59 +476,48 @@ public class InteractiveJavascriptCompletor implements Completor {
MethodDescriptor[] methods = info.getMethodDescriptors();
for (MethodDescriptor desc : methods) {
- if (desc.getName().startsWith(start)
- && !methodsCovered.contains(desc.getMethod())
- && !desc.getName().startsWith("_d")
- && !IGNORED_METHODS.contains(desc.getName())) {
+ if (desc.getName().startsWith(start) && !methodsCovered.contains(desc.getMethod())
+ && !desc.getName().startsWith("_d") && !IGNORED_METHODS.contains(desc.getName())) {
- Class[] parameters = desc.getMethod().getParameterTypes();
- if (parameters.length == 0 || (!parameters[0].equals(Subject.class))) {
+ Method m = desc.getMethod();
+ boolean isProxy = isProxyMethod(baseObject, m);
+ Class[] parameters = m.getParameterTypes();
+ boolean startsWithSubject = ((parameters.length > 0) && parameters[0].equals(Subject.class));
+ if ((isProxy && startsWithSubject) || !startsWithSubject) {
List list = found.get(desc.getName());
if (list == null) {
list = new ArrayList();
- found.put(desc.getName(),list);
+ found.put(desc.getName(), list);
}
- list.add(desc.getMethod());
+ list.add(m);
}
}
}
-
} catch (Exception e) {
e.printStackTrace();
}
return found;
}
-
private static String getSignature(Object object, Method m) {
// If its our service proxy lookup the original interface that has the annotations
- if (object instanceof Proxy) {
- if (Proxy.getInvocationHandler(object) instanceof RemoteClientProxy) {
- try {
- m = ((RemoteClientProxy)Proxy.getInvocationHandler(object)).
- getRemoteInterface().
- getDeclaredMethod(m.getName(),m.getParameterTypes());
- } catch (NoSuchMethodException e) {
- Class[] params = m.getParameterTypes();
- Class[] newParams = new Class[params.length + 1];
- System.arraycopy(params, 0, newParams, 1, params.length);
- newParams[0] = Subject.class;
-
- try {
- m = ((RemoteClientProxy)Proxy.getInvocationHandler(object)).
- getRemoteInterface().
- getDeclaredMethod(m.getName(),newParams);
- } catch (NoSuchMethodException nsme) {
-
- }
- }
+ if (isProxyMethod(object, m)) {
+ Class[] params = m.getParameterTypes();
+ Class[] newParams = new Class[params.length + 1];
+ System.arraycopy(params, 0, newParams, 1, params.length);
+ newParams[0] = Subject.class;
+
+ try {
+ m = ((RemoteClientProxy) Proxy.getInvocationHandler(object)).getRemoteInterface().getDeclaredMethod(
+ m.getName(), newParams);
+ } catch (NoSuchMethodException nsme) {
+ //
}
}
-
StringBuilder buf = new StringBuilder();
Type[] params = m.getGenericParameterTypes();
Annotation[][] annotations = m.getParameterAnnotations();
@@ -558,8 +530,8 @@ public class InteractiveJavascriptCompletor implements Completor {
buf.append("(");
boolean first = true;
for (Type type : params) {
- if (i == 0 && type.equals(Subject.class))
- { i++;
+ if (i == 0 && type.equals(Subject.class)) {
+ i++;
continue;
}
if (!first) {
@@ -591,6 +563,21 @@ public class InteractiveJavascriptCompletor implements Completor {
return buf.toString();
}
+ private static boolean isProxyMethod(Object object, Method m) {
+
+ boolean result = false;
+ if (object instanceof Proxy) {
+ if (Proxy.getInvocationHandler(object) instanceof RemoteClientProxy) {
+ try {
+ m = ((RemoteClientProxy) Proxy.getInvocationHandler(object)).getRemoteInterface()
+ .getDeclaredMethod(m.getName(), m.getParameterTypes());
+ } catch (NoSuchMethodException e) {
+ result = true;
+ }
+ }
+ }
+ return result;
+ }
public ScriptContext getContext() {
return context;
@@ -600,7 +587,6 @@ public class InteractiveJavascriptCompletor implements Completor {
this.context = context;
}
-
private static Object invoke(Object o, Method m) throws IllegalAccessException, InvocationTargetException {
boolean access = m.isAccessible();
m.setAccessible(true);
commit 81de8778335001b772bafe0404421efe790984af
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 13:14:13 2010 -0500
protect against NPE in WriteExternalAgent.
Add formatting to large native query constuction.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
index c074969..2bea98c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
@@ -855,7 +855,7 @@ public class Resource implements Comparable<Resource>, Externalizable {
public static final String QUERY_RESOURCE_VERSION_REPORT = "Resource.findResourceVersionReport";
public static final int MAX_SUPPORTED_RESOURCE_HIERARCHY_DEPTH = 7;
-
+
private static final String NAME_CONCAT_SEPARATOR = "~!@#)))";
/**
@@ -871,7 +871,7 @@ public class Resource implements Comparable<Resource>, Externalizable {
private static String guardNullCase(String column) {
return "(CASE WHEN " + column + " IS NULL THEN 'null' ELSE " + column + " END)";
}
-
+
/**
* We're trying to find the minimum ancestry level that provides the disambiguate paths
* (in terms of unique resource names) for given resources. Obviously this query only works
@@ -899,42 +899,42 @@ public class Resource implements Comparable<Resource>, Externalizable {
* This query has to be native because Hibernate doesn't understand the
* COUNT(DISTINCT ...)) where ... is anything else than a path to a property in Hibernate terminology.
*/
- public static final String NATIVE_QUERY_FIND_DISAMBIGUATION_LEVEL = ""
- + "SELECT COUNT(r.ID) AS target_cnt, "
- + "COUNT(DISTINCT(t.name)) AS bare_type_cnt,"
- + "COUNT(DISTINCT(t.name || '" + NAME_CONCAT_SEPARATOR + "' || t.plugin)) AS full_type_cnt,"
- + "COUNT(DISTINCT(r.name)) AS l1_cnt,"
- + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + ")) AS l2_cnt,"
- + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") + ")) AS l3_cnt,"
- + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") + ")) AS l4_cnt,"
- + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p4.name") + ")) AS l5_cnt,"
- + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p4.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p5.name") + ")) AS l6_cnt,"
- + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + "|| "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p4.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p5.name") + " || "
- + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p6.name") + ")) AS l7_cnt "
- + "FROM " + TABLE_NAME + " AS r "
- + "JOIN " + ResourceType.TABLE_NAME + " AS t ON r.RESOURCE_TYPE_ID = t.ID "
- + "LEFT OUTER JOIN " + TABLE_NAME + " AS p1 ON r.PARENT_RESOURCE_ID = p1.ID "
- + "LEFT OUTER JOIN " + TABLE_NAME + " AS p2 ON p1.PARENT_RESOURCE_ID = p2.ID "
- + "LEFT OUTER JOIN " + TABLE_NAME + " AS p3 ON p2.PARENT_RESOURCE_ID = p3.ID "
- + "LEFT OUTER JOIN " + TABLE_NAME + " AS p4 ON p3.PARENT_RESOURCE_ID = p4.ID "
- + "LEFT OUTER JOIN " + TABLE_NAME + " AS p5 ON p4.PARENT_RESOURCE_ID = p5.ID "
- + "LEFT OUTER JOIN " + TABLE_NAME + " AS p6 ON p5.PARENT_RESOURCE_ID = p6.ID "
+ public static final String NATIVE_QUERY_FIND_DISAMBIGUATION_LEVEL = "" //
+ + "SELECT COUNT(r.ID) AS target_cnt, " //
+ + "COUNT(DISTINCT(t.name)) AS bare_type_cnt," //
+ + "COUNT(DISTINCT(t.name || '" + NAME_CONCAT_SEPARATOR + "' || t.plugin)) AS full_type_cnt," //
+ + "COUNT(DISTINCT(r.name)) AS l1_cnt," //
+ + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") + ")) AS l2_cnt," //
+ + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") + ")) AS l3_cnt," //
+ + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") + ")) AS l4_cnt," //
+ + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p4.name") + ")) AS l5_cnt," //
+ + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p4.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p5.name") + ")) AS l6_cnt," //
+ + "COUNT(DISTINCT(r.name || '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p1.name") //
+ + "|| " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p2.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p3.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p4.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p5.name") //
+ + " || " + " '" + NAME_CONCAT_SEPARATOR + "' || " + guardNullCase("p6.name") + ")) AS l7_cnt " //
+ + "FROM " + TABLE_NAME + " AS r " //
+ + "JOIN " + ResourceType.TABLE_NAME + " AS t ON r.RESOURCE_TYPE_ID = t.ID " //
+ + "LEFT OUTER JOIN " + TABLE_NAME + " AS p1 ON r.PARENT_RESOURCE_ID = p1.ID " //
+ + "LEFT OUTER JOIN " + TABLE_NAME + " AS p2 ON p1.PARENT_RESOURCE_ID = p2.ID " //
+ + "LEFT OUTER JOIN " + TABLE_NAME + " AS p3 ON p2.PARENT_RESOURCE_ID = p3.ID " //
+ + "LEFT OUTER JOIN " + TABLE_NAME + " AS p4 ON p3.PARENT_RESOURCE_ID = p4.ID " //
+ + "LEFT OUTER JOIN " + TABLE_NAME + " AS p5 ON p4.PARENT_RESOURCE_ID = p5.ID " //
+ + "LEFT OUTER JOIN " + TABLE_NAME + " AS p6 ON p5.PARENT_RESOURCE_ID = p6.ID " //
+ "WHERE r.ID IN (@@RESOURCE_IDS@@)";
-
+
private static final long serialVersionUID = 1L;
public static final Resource ROOT = null;
@@ -1775,7 +1775,7 @@ public class Resource implements Comparable<Resource>, Externalizable {
// We make a copy of the childResources Set for two reasons: 1) to avoid calling writeObject() on the Set if it
// happens to be a Hibernate proxy (which would only ever be true on the Server side), and 2) to reduce the
// chances of a ConcurrentModificationException occurring in some other thread that is iterating the original Set.
- out.writeObject(new LinkedHashSet<Resource>(childResources));
+ out.writeObject((null == childResources) ? null : new LinkedHashSet<Resource>(childResources));
// Don't write plugin configs out if they are a lazy proxy
if (pluginConfiguration != null && pluginConfiguration.getClass().getName().contains("hibernate")) {
commit e0c240077ab3d3c0ac79829fdf8eb1cf63de940f
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Mar 12 12:58:01 2010 -0500
Add methods that conform to our standard Criteria class API naming.
Deprecate the misnamed methods.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
index 7f6509a..4e2c06f 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
@@ -55,22 +55,82 @@ public class RoleCriteria extends Criteria {
return Role.class;
}
- public Integer getFilterId() {
- return this.filterId;
+ public void addFilterId(Integer filterId) {
+ this.filterId = filterId;
+ }
+
+ public void addFilterName(String filterName) {
+ this.filterName = filterName;
+ }
+
+ public void addFilterDescription(String filterDescription) {
+ this.filterDescription = filterDescription;
+ }
+
+ /**
+ * Requires MANAGE_SECURITY
+ * @param fetchSubjects
+ */
+ public void fetchSubjects(boolean fetchSubjects) {
+ this.fetchSubjects = fetchSubjects;
+ }
+
+ /**
+ * Requires MANAGE_SECURITY
+ * @param fetchResourceGroups
+ */
+ public void fetchResourceGroups(boolean fetchResourceGroups) {
+ this.fetchResourceGroups = fetchResourceGroups;
}
+ public void fetchPermissions(boolean fetchPermissions) {
+ this.fetchPermissions = fetchPermissions;
+ }
+
+ public void fetchRoleNotifications(boolean fetchRoleNotifications) {
+ this.fetchRoleNotifications = fetchRoleNotifications;
+ }
+
+ public void addSortName(PageOrdering sortName) {
+ addSortField("name");
+ this.sortName = sortName;
+ }
+
+ /** subclasses should override as necessary */
+ public boolean isSecurityManagerRequired() {
+ return (this.fetchSubjects || this.fetchResourceGroups);
+ }
+
+ /**
+ * @Deprecated use addFilterId
+ */
+ @Deprecated
public void setFilterId(Integer filterId) {
this.filterId = filterId;
}
+ /**
+ * @Deprecated use addFilterName
+ */
+ @Deprecated
public void setFilterName(String filterName) {
this.filterName = filterName;
}
+ /**
+ * @Deprecated use addFilterDescription
+ */
+ @Deprecated
public void setFilterDescription(String filterDescription) {
this.filterDescription = filterDescription;
}
+ @Deprecated
+ public Integer getFilterId() {
+ return this.filterId;
+ }
+
+ @Deprecated
public boolean getFetchSubjects() {
return this.fetchSubjects;
}
@@ -78,7 +138,9 @@ public class RoleCriteria extends Criteria {
/**
* Requires MANAGE_SECURITY
* @param fetchSubjects
+ * @Deprecated use fetchSubjects
*/
+ @Deprecated
public void setFetchSubjects(boolean fetchSubjects) {
this.fetchSubjects = fetchSubjects;
}
@@ -86,27 +148,35 @@ public class RoleCriteria extends Criteria {
/**
* Requires MANAGE_SECURITY
* @param fetchSubjects
+ * @Deprecated use fetchResourceGroups
*/
+ @Deprecated
public void setFetchResourceGroups(boolean fetchResourceGroups) {
this.fetchResourceGroups = fetchResourceGroups;
}
+ /**
+ * @Deprecated use fetchPermissions
+ */
+ @Deprecated
public void setFetchPermissions(boolean fetchPermissions) {
this.fetchPermissions = fetchPermissions;
}
+ /**
+ * @Deprecated use fetchRoleNotifications
+ */
+ @Deprecated
public void setFetchRoleNotifications(boolean fetchRoleNotifications) {
this.fetchRoleNotifications = fetchRoleNotifications;
}
+ /**
+ * @Deprecated use addSortName
+ */
+ @Deprecated
public void setSortName(PageOrdering sortName) {
addSortField("name");
this.sortName = sortName;
}
-
- /** subclasses should override as necessary */
- public boolean isSecurityManagerRequired() {
- return (this.fetchSubjects || this.fetchResourceGroups);
- }
-
}
commit fb9917a00f83cdde9a9b0c07237c8654751d14cb
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Mar 11 08:49:57 2010 -0500
bz 572535 - make sure security interceptor checks subject ID as well as subject NAME when confirming the session is valid.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index dbe792f..bb22f31 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -567,14 +567,14 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
}
/**
- * @see org.rhq.enterprise.server.auth.SubjectManagerLocal#isValidSessionId(int, String)
+ * @see org.rhq.enterprise.server.auth.SubjectManagerLocal#isValidSessionId(int, String, int)
*/
// we exclude the default interceptors because the required permissions interceptor calls into this
@ExcludeDefaultInterceptors
- public boolean isValidSessionId(int session, String username) {
+ public boolean isValidSessionId(int session, String username, int userid) {
try {
Subject sessionSubject = sessionManager.getSubject(session);
- return username.equals(sessionSubject.getName());
+ return username.equals(sessionSubject.getName()) && userid == sessionSubject.getId();
} catch (Exception e) {
return false;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
index e3f8ded..9b19825 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
@@ -150,15 +150,16 @@ public interface SubjectManagerLocal {
void deleteUsers(Subject subject, int[] subjectIds);
/**
- * Determines if the given session ID is valid and it is associated with the given user.
+ * Determines if the given session ID is valid and it is associated with the given username and user ID.
*
* @param session
* @param username
+ * @param userid
*
* @return <code>true</code> if the session ID indentifies a valid session; <code>false</code> if it is invalid or
* has timed out
*/
- boolean isValidSessionId(int session, String username);
+ boolean isValidSessionId(int session, String username, int userid);
/**
* This returns a list of subjects that are available to be assigned to a given role but not yet assigned to that
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RequiredPermissionsInterceptor.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RequiredPermissionsInterceptor.java
index b9847a5..1b6962d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RequiredPermissionsInterceptor.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RequiredPermissionsInterceptor.java
@@ -22,10 +22,13 @@ import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
@@ -92,7 +95,7 @@ public class RequiredPermissionsInterceptor {
SubjectManagerLocal subject_manager = LookupUtil.getSubjectManager();
// isValidSessionId will also update the session's last-access-time
- if (!subject_manager.isValidSessionId(subject.getSessionId(), subject.getName())) {
+ if (!subject_manager.isValidSessionId(subject.getSessionId(), subject.getName(), subject.getId())) {
// if this happens, it is possible someone is trying to spoof an authenticated user!
throw buildPermissionException("The session ID for user [" + subject.getName()
+ "] is invalid!", invocation_context);
commit 059f86a573dfd7a3b0b894817b9ca7db4abdcb9f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Mar 10 10:03:05 2010 -0500
fix some dsl processing stuff and add tests
diff --git a/modules/enterprise/remoting/scripts/src/test/resources/dummy.zip b/modules/enterprise/remoting/scripts/src/test/resources/dummy.zip
new file mode 100644
index 0000000..933fa1a
Binary files /dev/null and b/modules/enterprise/remoting/scripts/src/test/resources/dummy.zip differ
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index 0edf73e..e97495b 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -67,15 +67,15 @@ function testDeployment() {
// create the config, setting the required properties from the recipe
var config = new Configuration();
- var property = new PropertySimple("bundleTest.deployHome", "C:/temp");
+ var property = new PropertySimple("bundleTest.deployHome", "/tmp/bundle-test");
config.put( property );
// create a deploy def using the above config
- var testDeployDef = BundleManager.createBundleDeployDefinition(testBundleVersion.getId(), "Windows Deployment", "Windows Deployment of testBundle WAR", config, false, -1, false);
+ var testDeployDef = BundleManager.createBundleDeployDefinition(testBundleVersion.getId(), "Deployment Test", "Deployment Test of testBundle WAR", config, false, -1, false);
// Find a target platform
var rc = new ResourceCriteria();
- rc.addFilterResourceTypeName("win");
+ rc.addFilterResourceTypeName("in"); // wINdows, lINux
var winPlatforms = ResourceManager.findResourcesByCriteria(rc);
var platformId = winPlatforms.get(0).getId();
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManagerZip.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManagerZip.js
new file mode 100644
index 0000000..4cc0bd1
--- /dev/null
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManagerZip.js
@@ -0,0 +1,101 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * Thus test script works with a real env including at least one platform resource and a running agent on
+ * said platform.
+ */
+
+var TestsEnabled = true;
+
+var bundleName = 'testScriptBundleZip';
+
+// note, super-user, will not test any security constraints
+var subject = rhq.login('rhqadmin', 'rhqadmin');
+
+executeAllTests();
+
+rhq.logout();
+
+function testDeployment() {
+ if ( !TestsEnabled ) {
+ return;
+ }
+
+ // delete the test bundle if it exists
+ var bc = new BundleCriteria();
+ bc.addFilterName( bundleName );
+ var bundles = BundleManager.findBundlesByCriteria( bc );
+ if ( null != bundles && bundles.size() > 0 ) {
+ print( "\n Deleting existing testScriptBundle in order to test a fresh deploy...")
+ BundleManager.deleteBundle( bundles.get(0).getId() );
+ }
+
+ // create the test bundle
+ var testBundle = BundleManager.createBundle( bundleName, getBundleType() );
+
+ // define the recipe for bundleVersion 1.0
+ var recipe = "deploy -f dummy.zip -d <%dummy.deployHome%>\n"
+ + "realize -f <%dummy.deployHome%>/dummy/README.txt\n"
+ + "realize -f <%dummy.deployHome%>/dummy/subdirectory/file.txt";
+
+ // create bundleVersion 1.0
+ var testBundleVersion = BundleManager.createBundleVersion( testBundle.getId(), bundleName, null, recipe);
+
+ // add the single bundleFile, the test war file
+ var fileBytes = scriptUtil.getFileBytes("./src/test/resources/dummy.zip");
+ var bundleFile = BundleManager.addBundleFileViaByteArray(testBundleVersion.getId(), "dummy.zip",
+ "1.0", null, fileBytes, false);
+
+ // create the config, setting the required properties from the recipe
+ var config = new Configuration();
+ var property = new PropertySimple("dummy.deployHome", "/tmp/bundle-test");
+ config.put( property );
+ var property2 = new PropertySimple("dummy.name", "NAME REPLACED HERE!!!");
+ config.put( property2 );
+ var property3 = new PropertySimple("dummy.description", "FLOPPY!!!");
+ config.put( property3 );
+
+ // create a deploy def using the above config
+ var testDeployDef = BundleManager.createBundleDeployDefinition(testBundleVersion.getId(), "Deployment Test", "Deployment Test of dummy ZIP", config, false, -1, false);
+
+ // Find a target platform
+ var rc = new ResourceCriteria();
+ rc.addFilterResourceTypeName("in"); // wINdows, lINux
+ var winPlatforms = ResourceManager.findResourcesByCriteria(rc);
+ var platformId = winPlatforms.get(0).getId();
+
+ var bundleScheduleResponse = BundleManager.scheduleBundleDeployment(testDeployDef.getId(), platformId);
+}
+
+function getBundleType() {
+
+ var types = BundleManager.getAllBundleTypes();
+ for (i=0; ( i < types.size()); ++i ) {
+ if ( types.get(i).getName().equals( "File Template Bundle" )) {
+ return types.get(i).getId();
+ }
+ }
+
+ print( "\n Could not find template bundle type, is the plugin loaded?");
+}
diff --git a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
index f4cb102..d20526c 100644
--- a/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
+++ b/modules/plugins/filetemplate-bundle/src/main/java/org/rhq/plugins/filetemplate/ProcessingRecipeContext.java
@@ -103,7 +103,7 @@ public class ProcessingRecipeContext extends RecipeContext {
public void addRealizedFile(String file) {
super.addRealizedFile(file);
- File trueFile = new File(this.baseWorkingDirectory, file);
+ File trueFile = new File(file);
RecipeParser parser = getParser();
File realizedTmpFile = null;
FileWriter realizedTmpFileWriter = null;
@@ -252,6 +252,7 @@ public class ProcessingRecipeContext extends RecipeContext {
} else if (filepath.endsWith(".zip")) {
exe = "unzip";
args = new ArrayList<String>();
+ args.add("-o");
args.add(filepath);
args.add("-d");
args.add(directory);
diff --git a/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java b/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java
index 188e127..ff65c2f 100644
--- a/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java
+++ b/modules/plugins/filetemplate-bundle/src/test/java/org/rhq/plugins/filetemplate/ProcessingRecipeContextTest.java
@@ -63,7 +63,7 @@ public class ProcessingRecipeContextTest {
File testDir = getTestDir("testrealize");
File file = writeFile("a b c\nhello<% var %>world\na b c\n", testDir, "config.txt");
- addRecipeCommand("realize --file=" + file.getName());
+ addRecipeCommand("realize --file=" + file.getPath());
ProcessingRecipeContext context = createRecipeContext(testDir);
context.addReplacementVariableValue("var", "BOO");
@@ -71,7 +71,7 @@ public class ProcessingRecipeContextTest {
Set<String> files = context.getRealizedFiles();
assert files.size() == 1 : files;
- assert files.contains(file.getName()) : files;
+ assert files.contains(file.getPath()) : files;
String realizedContent = readFile(file);
assert realizedContent.equals("a b c\nhelloBOOworld\na b c\n") : realizedContent;
commit 99e7040be3c7d349f0474bf2d06e35484a618770
Merge: dce376f... 1bf5cfa...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 10 15:53:06 2010 +0100
Merge branch 'alertPlugin'
commit 1bf5cfa77498ad6f2cfe9112f902ebfcc410d7f2
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Wed Mar 10 14:59:52 2010 +0100
CSS fix
diff --git a/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml b/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
index 9f0ac31..9d04a9a 100644
--- a/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
+++ b/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
@@ -14,7 +14,7 @@
<body>
<h:panelGrid columns="2" style="vertical-align:top;width:100%" >
<h:panelGroup>
- <rich:panel style="vertical-align:top;width:30%" header="Select a resource">
+ <rich:panel style="vertical-align:top" header="Select a resource">
<h:outputText value="Select mode"/>
<br/>
<h:form id="selectResourceForm">
@@ -42,7 +42,7 @@
<h:panelGroup style="vertical-align:top;" >
- <rich:panel rendered="#{not empty operationsBean.operationIds}" style="vertical-align:top;width=70%" header="Select the operation">
+ <rich:panel rendered="#{not empty operationsBean.operationIds}" style="vertical-align:top" header="Select the operation">
Operations for: <h:outputText value=" #{operationsBean.resourceName}"/>
<br/>
commit dce376f396bc103f71347ac4b045be212cc7207a
Merge: 8ba41d5... 6bf9398...
Author: Filip Drabek <fdrabek(a)dhcp-lab-136.englab.brq.redhat.com>
Date: Wed Mar 10 09:31:11 2010 +0100
Merge branch 'linux-config'
commit 07736456af64c4bc848d3d01828228f0c961fac4
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 21:47:08 2010 -0500
git forced LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
index 86182ff..2b34f6f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/ext/geochrono/scripts/units.js
@@ -1,86 +1,86 @@
-/*==================================================
- * Geochrono Unit
- *==================================================
- */
-
-Timeline.GeochronoUnit = new Object();
-
-Timeline.GeochronoUnit.MA = 0;
-Timeline.GeochronoUnit.AGE = 1;
-Timeline.GeochronoUnit.EPOCH = 2;
-Timeline.GeochronoUnit.PERIOD = 3;
-Timeline.GeochronoUnit.ERA = 4;
-Timeline.GeochronoUnit.EON = 5;
-
-Timeline.GeochronoUnit.getParser = function(format) {
- return Timeline.GeochronoUnit.parseFromObject;
-};
-
-Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
- return new Timeline.GeochronoLabeller(locale);
-};
-
-Timeline.GeochronoUnit.wrapMA = function (n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.makeDefaultValue = function () {
- return Timeline.GeochronoUnit.wrapMA(0);
-};
-
-Timeline.GeochronoUnit.cloneValue = function (v) {
- return new Timeline.GeochronoUnit._MA(v._n);
-};
-
-Timeline.GeochronoUnit.parseFromObject = function(o) {
- if (o instanceof Timeline.GeochronoUnit._MA) {
- return o;
- } else if (typeof o == "number") {
- return Timeline.GeochronoUnit.wrapMA(o);
- } else if (typeof o == "string" && o.length > 0) {
- return Timeline.GeochronoUnit.wrapMA(Number(o));
- } else {
- return null;
- }
-};
-
-Timeline.GeochronoUnit.toNumber = function(v) {
- return v._n;
-};
-
-Timeline.GeochronoUnit.fromNumber = function(n) {
- return new Timeline.GeochronoUnit._MA(n);
-};
-
-Timeline.GeochronoUnit.compare = function(v1, v2) {
- var n1, n2;
- if (typeof v1 == "object") {
- n1 = v1._n;
- } else {
- n1 = Number(v1);
- }
- if (typeof v2 == "object") {
- n2 = v2._n;
- } else {
- n2 = Number(v2);
- }
-
- return n2 - n1;
-};
-
-Timeline.GeochronoUnit.earlier = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.later = function(v1, v2) {
- return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
-};
-
-Timeline.GeochronoUnit.change = function(v, n) {
- return new Timeline.GeochronoUnit._MA(v._n - n);
-};
-
-Timeline.GeochronoUnit._MA = function(n) {
- this._n = n;
-};
-
+/*==================================================
+ * Geochrono Unit
+ *==================================================
+ */
+
+Timeline.GeochronoUnit = new Object();
+
+Timeline.GeochronoUnit.MA = 0;
+Timeline.GeochronoUnit.AGE = 1;
+Timeline.GeochronoUnit.EPOCH = 2;
+Timeline.GeochronoUnit.PERIOD = 3;
+Timeline.GeochronoUnit.ERA = 4;
+Timeline.GeochronoUnit.EON = 5;
+
+Timeline.GeochronoUnit.getParser = function(format) {
+ return Timeline.GeochronoUnit.parseFromObject;
+};
+
+Timeline.GeochronoUnit.createLabeller = function(locale, timeZone) {
+ return new Timeline.GeochronoLabeller(locale);
+};
+
+Timeline.GeochronoUnit.wrapMA = function (n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.makeDefaultValue = function () {
+ return Timeline.GeochronoUnit.wrapMA(0);
+};
+
+Timeline.GeochronoUnit.cloneValue = function (v) {
+ return new Timeline.GeochronoUnit._MA(v._n);
+};
+
+Timeline.GeochronoUnit.parseFromObject = function(o) {
+ if (o instanceof Timeline.GeochronoUnit._MA) {
+ return o;
+ } else if (typeof o == "number") {
+ return Timeline.GeochronoUnit.wrapMA(o);
+ } else if (typeof o == "string" && o.length > 0) {
+ return Timeline.GeochronoUnit.wrapMA(Number(o));
+ } else {
+ return null;
+ }
+};
+
+Timeline.GeochronoUnit.toNumber = function(v) {
+ return v._n;
+};
+
+Timeline.GeochronoUnit.fromNumber = function(n) {
+ return new Timeline.GeochronoUnit._MA(n);
+};
+
+Timeline.GeochronoUnit.compare = function(v1, v2) {
+ var n1, n2;
+ if (typeof v1 == "object") {
+ n1 = v1._n;
+ } else {
+ n1 = Number(v1);
+ }
+ if (typeof v2 == "object") {
+ n2 = v2._n;
+ } else {
+ n2 = Number(v2);
+ }
+
+ return n2 - n1;
+};
+
+Timeline.GeochronoUnit.earlier = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) < 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.later = function(v1, v2) {
+ return Timeline.GeochronoUnit.compare(v1, v2) > 0 ? v1 : v2;
+};
+
+Timeline.GeochronoUnit.change = function(v, n) {
+ return new Timeline.GeochronoUnit._MA(v._n - n);
+};
+
+Timeline.GeochronoUnit._MA = function(n) {
+ this._n = n;
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
index 92027ac..46a8adf 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/ext/japanese-eras.js
@@ -144,252 +144,252 @@ Timeline.JapaneseEraDateLabeller._eras = new Timeline.SortedArray(
return e1.startingYear - e2.startingYear;
},
[
- { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
- { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
- { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
- { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
- { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
- { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
- { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
- { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
- { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
- { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
- { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
- { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
- { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
- { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
- { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
- { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
- { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
- { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
- { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
- { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
- { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
- { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
- { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
- { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
- { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
- { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
- { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
- { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
- { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
- { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
- { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
- { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
- { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
- { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
- { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
- { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
- { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
- { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
- { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
- { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
- { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
- { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
- { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
- { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
- { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
- { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
- { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
- { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
- { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
- { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
- { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
- { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
- { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
- { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
- { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
- { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
- { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
- { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
- { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
- { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
- { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
- { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
- { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
- { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
- { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
- { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
- { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
- { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
- { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
- { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
- { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
- { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
- { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
- { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
- { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
- { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
- { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
- { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
- { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
- { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
- { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
- { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
- { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
- { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
- { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
- { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
- { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
- { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
- { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
- { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
- { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
- { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
- { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
- { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
- { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
- { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
- { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
- { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
- { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
- { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
- { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
- { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
- { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
- { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
- { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
- { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
- { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
- { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
- { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
- { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
- { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
- { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
- { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
- { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
- { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
- { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
- { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
- { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
- { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
- { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
- { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
- { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
- { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
- { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
- { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
- { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
- { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
- { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
- { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
- { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
- { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
- { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
- { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
- { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
- { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
- { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
- { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
- { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
- { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
- { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
- { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
- { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
- { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
- { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
- { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
- { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
- { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
- { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
- { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
- { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
- { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
- { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
- { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
- { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
- { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
- { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
- { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
- { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
- { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
- { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
- { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
- { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
- { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
- { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
- { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
- { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
- { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
- { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
- { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
- { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
- { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
- { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
- { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
- { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
- { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
- { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
- { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
- { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
- { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
- { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
- { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
- { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
- { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
- { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
- { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
- { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
- { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
- { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
- { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
- { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
- { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
- { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
- { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
- { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
- { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
- { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
- { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
- { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
- { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
- { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
- { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
- { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
- { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
- { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
- { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
- { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
- { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
- { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
- { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
- { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
- { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
- { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
- { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
- { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
- { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
- { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
- { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
- { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
- { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
- { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
- { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
- { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
- { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
- { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
- { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
- { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
- { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
- { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
- { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
- { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
- { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
- { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
- { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
- { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
- { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
- { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
- { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
- { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
- { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
- { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
- { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
- { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
- { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
- { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
- { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
- { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
- { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
+ { startingYear: 645, japaneseName: '倧å', romanizedName: "Taika" },
+ { startingYear: 650, japaneseName: 'çœé', romanizedName: "Hakuchi" },
+ { startingYear: 686, japaneseName: 'æ±é³¥', romanizedName: "ShuchÅ" },
+ { startingYear: 701, japaneseName: '倧å®', romanizedName: "TaihÅ" },
+ { startingYear: 704, japaneseName: 'æ
¶é²', romanizedName: "Keiun" },
+ { startingYear: 708, japaneseName: 'åé
', romanizedName: "WadÅ" },
+ { startingYear: 715, japaneseName: 'éäº', romanizedName: "Reiki" },
+ { startingYear: 717, japaneseName: 'é€è', romanizedName: "YÅrÅ" },
+ { startingYear: 724, japaneseName: 'ç¥äº', romanizedName: "Jinki" },
+ { startingYear: 729, japaneseName: '倩平', romanizedName: "TenpyÅ" },
+ { startingYear: 749, japaneseName: '倩平æå®', romanizedName: "TenpyÅ-kanpÅ" },
+ { startingYear: 749, japaneseName: '倩平åå®', romanizedName: "TenpyÅ-shÅhÅ" },
+ { startingYear: 757, japaneseName: '倩平å®å', romanizedName: "TenpyÅ-hÅji" },
+ { startingYear: 765, japaneseName: '倩平ç¥è·', romanizedName: "TenpyÅ-jingo" },
+ { startingYear: 767, japaneseName: 'ç¥è·æ¯é²', romanizedName: "Jingo-keiun" },
+ { startingYear: 770, japaneseName: 'å®äº', romanizedName: "HÅki" },
+ { startingYear: 781, japaneseName: '倩å¿', romanizedName: "Ten'Å" },
+ { startingYear: 782, japaneseName: '延æŠ', romanizedName: "Enryaku" },
+ { startingYear: 806, japaneseName: '倧å', romanizedName: "DaidÅ" },
+ { startingYear: 810, japaneseName: 'åŒä»', romanizedName: "KÅnin" },
+ { startingYear: 824, japaneseName: '倩é·', romanizedName: "TenchÅ" },
+ { startingYear: 834, japaneseName: 'æ¿å', romanizedName: "JÅwa" },
+ { startingYear: 848, japaneseName: 'å祥', romanizedName: "KajÅ" },
+ { startingYear: 851, japaneseName: 'ä»å¯¿', romanizedName: "Ninju" },
+ { startingYear: 854, japaneseName: 'æè¡¡', romanizedName: "SaikÅ" },
+ { startingYear: 857, japaneseName: '倩å®', romanizedName: "Tennan" },
+ { startingYear: 859, japaneseName: 'è²èŠ³', romanizedName: "JÅgan" },
+ { startingYear: 877, japaneseName: 'å
æ
¶', romanizedName: "GangyÅ" },
+ { startingYear: 885, japaneseName: 'ä»å', romanizedName: "Ninna" },
+ { startingYear: 889, japaneseName: 'å¯å¹³', romanizedName: "KanpyÅ" },
+ { startingYear: 898, japaneseName: 'ææ³°', romanizedName: "ShÅtai" },
+ { startingYear: 901, japaneseName: '延å', romanizedName: "Engi" },
+ { startingYear: 923, japaneseName: '延é·', romanizedName: "EnchÅ" },
+ { startingYear: 931, japaneseName: 'æ¿å¹³', romanizedName: "JÅhei" },
+ { startingYear: 938, japaneseName: '倩æ
¶', romanizedName: "TengyÅ" },
+ { startingYear: 947, japaneseName: '倩æŠ', romanizedName: "Tenryaku" },
+ { startingYear: 957, japaneseName: '倩埳', romanizedName: "Tentoku" },
+ { startingYear: 961, japaneseName: 'å¿å', romanizedName: "Åwa" },
+ { startingYear: 964, japaneseName: '康ä¿', romanizedName: "KÅhÅ" },
+ { startingYear: 968, japaneseName: 'å®å', romanizedName: "Anna" },
+ { startingYear: 970, japaneseName: '倩çŠ', romanizedName: "Tenroku" },
+ { startingYear: 973, japaneseName: '倩延', romanizedName: "Ten'en" },
+ { startingYear: 976, japaneseName: 'è²å
', romanizedName: "JÅgen" },
+ { startingYear: 978, japaneseName: '倩å
', romanizedName: "Tengen" },
+ { startingYear: 983, japaneseName: '氞芳', romanizedName: "Eikan" },
+ { startingYear: 985, japaneseName: 'å¯å', romanizedName: "Kanna" },
+ { startingYear: 987, japaneseName: '氞延', romanizedName: "Eien" },
+ { startingYear: 988, japaneseName: 'æ°žç¥', romanizedName: "Eiso" },
+ { startingYear: 990, japaneseName: 'æ£æŠ', romanizedName: "ShÅryaku" },
+ { startingYear: 995, japaneseName: 'é·åŸ³', romanizedName: "ChÅtoku" },
+ { startingYear: 999, japaneseName: 'é·ä¿', romanizedName: "ChÅhÅ" },
+ { startingYear: 1004, japaneseName: 'å¯åŒ', romanizedName: "KankÅ" },
+ { startingYear: 1012, japaneseName: 'é·å', romanizedName: "ChÅwa" },
+ { startingYear: 1017, japaneseName: 'å¯ä»', romanizedName: "Kannin" },
+ { startingYear: 1021, japaneseName: 'æ²»å®', romanizedName: "Jian" },
+ { startingYear: 1024, japaneseName: 'äžå¯¿', romanizedName: "Manju" },
+ { startingYear: 1028, japaneseName: 'é·å
', romanizedName: "ChÅgen" },
+ { startingYear: 1037, japaneseName: 'é·æŠ', romanizedName: "ChÅryaku" },
+ { startingYear: 1040, japaneseName: 'é·ä¹
', romanizedName: "ChÅkyÅ«" },
+ { startingYear: 1044, japaneseName: 'å¯åŸ³', romanizedName: "Kantoku" },
+ { startingYear: 1046, japaneseName: 'æ°žæ¿', romanizedName: "EishÅ" },
+ { startingYear: 1053, japaneseName: '倩å', romanizedName: "Tengi" },
+ { startingYear: 1058, japaneseName: '康平', romanizedName: "KÅhei" },
+ { startingYear: 1065, japaneseName: 'æ²»æŠ', romanizedName: "Jiryaku" },
+ { startingYear: 1069, japaneseName: '延ä¹
', romanizedName: "Enkyū" },
+ { startingYear: 1074, japaneseName: 'æ¿ä¿', romanizedName: "JÅhÅ" },
+ { startingYear: 1077, japaneseName: 'æ¿æŠ', romanizedName: "JÅryaku" },
+ { startingYear: 1081, japaneseName: 'æ°žä¿', romanizedName: "EihÅ" },
+ { startingYear: 1084, japaneseName: 'å¿åŸ³', romanizedName: "Åtoku" },
+ { startingYear: 1087, japaneseName: 'å¯æ²»', romanizedName: "Kanji" },
+ { startingYear: 1094, japaneseName: 'åä¿', romanizedName: "KahÅ" },
+ { startingYear: 1096, japaneseName: 'æ°žé·', romanizedName: "EichÅ" },
+ { startingYear: 1097, japaneseName: 'æ¿åŸ³', romanizedName: "JÅtoku" },
+ { startingYear: 1099, japaneseName: '康å', romanizedName: "KÅwa" },
+ { startingYear: 1104, japaneseName: 'é·æ²»', romanizedName: "ChÅji" },
+ { startingYear: 1106, japaneseName: 'åæ¿', romanizedName: "KajÅ" },
+ { startingYear: 1108, japaneseName: '倩ä»', romanizedName: "Tennin" },
+ { startingYear: 1110, japaneseName: '倩氞', romanizedName: "Ten'ei" },
+ { startingYear: 1113, japaneseName: 'æ°žä¹
', romanizedName: "Eikyū" },
+ { startingYear: 1118, japaneseName: 'å
æ°ž', romanizedName: "Gen'ei" },
+ { startingYear: 1120, japaneseName: 'ä¿å®', romanizedName: "HÅan" },
+ { startingYear: 1124, japaneseName: '倩治', romanizedName: "Tenji" },
+ { startingYear: 1126, japaneseName: '倧治', romanizedName: "Daiji" },
+ { startingYear: 1131, japaneseName: '倩æ¿', romanizedName: "TenshÅ" },
+ { startingYear: 1132, japaneseName: 'é·æ¿', romanizedName: "ChÅshÅ" },
+ { startingYear: 1135, japaneseName: 'ä¿å»¶', romanizedName: "HÅen" },
+ { startingYear: 1141, japaneseName: 'æ°žæ²»', romanizedName: "Eiji" },
+ { startingYear: 1142, japaneseName: '康治', romanizedName: "KÅji" },
+ { startingYear: 1144, japaneseName: '倩é€', romanizedName: "Ten'yÅ" },
+ { startingYear: 1145, japaneseName: 'ä¹
å®', romanizedName: "KyÅ«an" },
+ { startingYear: 1151, japaneseName: 'ä»å¹³', romanizedName: "Ninpei" },
+ { startingYear: 1154, japaneseName: 'ä¹
寿', romanizedName: "Kyūju" },
+ { startingYear: 1156, japaneseName: 'ä¿å
', romanizedName: "HÅgen" },
+ { startingYear: 1159, japaneseName: '平治', romanizedName: "Heiji" },
+ { startingYear: 1160, japaneseName: 'æ°žæŠ', romanizedName: "Eiryaku" },
+ { startingYear: 1161, japaneseName: 'å¿ä¿', romanizedName: "ÅhÅ" },
+ { startingYear: 1163, japaneseName: 'é·å¯', romanizedName: "ChÅkan" },
+ { startingYear: 1165, japaneseName: 'æ°žäž', romanizedName: "Eiman" },
+ { startingYear: 1166, japaneseName: 'ä»å®', romanizedName: "Ninnan" },
+ { startingYear: 1169, japaneseName: 'åå¿', romanizedName: "KaÅ" },
+ { startingYear: 1171, japaneseName: 'æ¿å®', romanizedName: "JÅan" },
+ { startingYear: 1175, japaneseName: 'å®å
', romanizedName: "Angen" },
+ { startingYear: 1177, japaneseName: 'æ²»æ¿', romanizedName: "JishÅ" },
+ { startingYear: 1181, japaneseName: 'é€å', romanizedName: "YÅwa" },
+ { startingYear: 1182, japaneseName: '寿氞', romanizedName: "Juei" },
+ { startingYear: 1184, japaneseName: 'å
æŠ', romanizedName: "Genryaku" },
+ { startingYear: 1185, japaneseName: 'ææ²»', romanizedName: "Bunji" },
+ { startingYear: 1190, japaneseName: '建ä¹
', romanizedName: "Kenkyū" },
+ { startingYear: 1199, japaneseName: 'æ£æ²»', romanizedName: "ShÅji" },
+ { startingYear: 1201, japaneseName: '建ä»', romanizedName: "Kennin" },
+ { startingYear: 1204, japaneseName: 'å
ä¹
', romanizedName: "Genkyū" },
+ { startingYear: 1206, japaneseName: '建氞', romanizedName: "Ken'ei" },
+ { startingYear: 1207, japaneseName: 'æ¿å
', romanizedName: "JÅgen" },
+ { startingYear: 1211, japaneseName: '建æŠ', romanizedName: "Kenryaku" },
+ { startingYear: 1213, japaneseName: '建ä¿', romanizedName: "KenpÅ" },
+ { startingYear: 1219, japaneseName: 'æ¿ä¹
', romanizedName: "JÅkyÅ«" },
+ { startingYear: 1222, japaneseName: 'è²å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1224, japaneseName: 'å
ä»', romanizedName: "Gennin" },
+ { startingYear: 1225, japaneseName: 'åçŠ', romanizedName: "Karoku" },
+ { startingYear: 1227, japaneseName: 'å®è²', romanizedName: "Antei" },
+ { startingYear: 1229, japaneseName: 'å¯å', romanizedName: "Kanki" },
+ { startingYear: 1232, japaneseName: 'è²æ°ž', romanizedName: "JÅei" },
+ { startingYear: 1233, japaneseName: '倩çŠ', romanizedName: "Tenpuku" },
+ { startingYear: 1234, japaneseName: 'ææŠ', romanizedName: "Bunryaku" },
+ { startingYear: 1235, japaneseName: 'åçŠ', romanizedName: "Katei" },
+ { startingYear: 1238, japaneseName: 'æŠä»', romanizedName: "Ryakunin" },
+ { startingYear: 1239, japaneseName: '延å¿', romanizedName: "En'Å" },
+ { startingYear: 1240, japaneseName: 'ä»æ²»', romanizedName: "Ninji" },
+ { startingYear: 1243, japaneseName: 'å¯å
', romanizedName: "Kangen" },
+ { startingYear: 1247, japaneseName: 'å®æ²»', romanizedName: "HÅji" },
+ { startingYear: 1249, japaneseName: '建é·', romanizedName: "KenchÅ" },
+ { startingYear: 1256, japaneseName: '康å
', romanizedName: "KÅgen" },
+ { startingYear: 1257, japaneseName: 'æ£å', romanizedName: "ShÅka" },
+ { startingYear: 1259, japaneseName: 'æ£å
', romanizedName: "ShÅgen" },
+ { startingYear: 1260, japaneseName: 'æå¿', romanizedName: "Bun'Å" },
+ { startingYear: 1261, japaneseName: 'åŒé·', romanizedName: "KÅcho" },
+ { startingYear: 1264, japaneseName: 'ææ°ž', romanizedName: "Bun'ei" },
+ { startingYear: 1275, japaneseName: '建治', romanizedName: "Kenji" },
+ { startingYear: 1278, japaneseName: 'åŒå®', romanizedName: "KÅan" },
+ { startingYear: 1288, japaneseName: 'æ£å¿', romanizedName: "ShÅÅ" },
+ { startingYear: 1293, japaneseName: 'æ°žä»', romanizedName: "Einin" },
+ { startingYear: 1299, japaneseName: 'æ£å®', romanizedName: "ShÅan" },
+ { startingYear: 1302, japaneseName: '也å
', romanizedName: "Kengen" },
+ { startingYear: 1303, japaneseName: 'åå
', romanizedName: "Kagen" },
+ { startingYear: 1306, japaneseName: '埳治', romanizedName: "Tokuji" },
+ { startingYear: 1308, japaneseName: '延æ
¶', romanizedName: "Enkei" },
+ { startingYear: 1311, japaneseName: 'å¿é·', romanizedName: "ÅchÅ" },
+ { startingYear: 1312, japaneseName: 'æ£å', romanizedName: "ShÅwa" },
+ { startingYear: 1317, japaneseName: 'æä¿', romanizedName: "BunpÅ" },
+ { startingYear: 1319, japaneseName: 'å
å¿', romanizedName: "Gen'Å" },
+ { startingYear: 1321, japaneseName: 'å
亚', romanizedName: "GenkyÅ" },
+ { startingYear: 1324, japaneseName: 'æ£äž', romanizedName: "ShÅchÅ«" },
+ { startingYear: 1326, japaneseName: 'åæŠ', romanizedName: "Karyaku" },
+ { startingYear: 1329, japaneseName: 'å
埳', romanizedName: "Gentoku" },
+ { startingYear: 1331, japaneseName: 'å
åŒ', romanizedName: "GenkÅ" },
+ { startingYear: 1334, japaneseName: '建æŠ', romanizedName: "Kenmu" },
+ { startingYear: 1336, japaneseName: '延å
', romanizedName: "Engen" },
+ { startingYear: 1340, japaneseName: 'èåœ', romanizedName: "KÅkoku" },
+ { startingYear: 1346, japaneseName: 'æ£å¹³', romanizedName: "ShÅhei" },
+ { startingYear: 1370, japaneseName: '建埳', romanizedName: "Kentoku" },
+ { startingYear: 1372, japaneseName: 'æäž', romanizedName: "BunchÅ«" },
+ { startingYear: 1375, japaneseName: '倩æ', romanizedName: "Tenju" },
+ { startingYear: 1381, japaneseName: 'åŒå', romanizedName: "KÅwa" },
+ { startingYear: 1384, japaneseName: 'å
äž', romanizedName: "GenchÅ«" },
+ { startingYear: 1332, japaneseName: 'æ£æ
¶', romanizedName: "ShÅkei" },
+ { startingYear: 1338, japaneseName: 'æŠå¿', romanizedName: "RyakuÅ" },
+ { startingYear: 1342, japaneseName: '康氞', romanizedName: "KÅei" },
+ { startingYear: 1345, japaneseName: 'è²å', romanizedName: "JÅwa" },
+ { startingYear: 1350, japaneseName: '芳å¿', romanizedName: "Kan'Å" },
+ { startingYear: 1352, japaneseName: 'æå', romanizedName: "Bunna" },
+ { startingYear: 1356, japaneseName: '延æ', romanizedName: "Enbun" },
+ { startingYear: 1361, japaneseName: '康å®', romanizedName: "KÅan" },
+ { startingYear: 1362, japaneseName: 'è²æ²»', romanizedName: "JÅji" },
+ { startingYear: 1368, japaneseName: 'å¿å®', romanizedName: "Åan" },
+ { startingYear: 1375, japaneseName: 'æ°žå', romanizedName: "Eiwa" },
+ { startingYear: 1379, japaneseName: '康æŠ', romanizedName: "KÅryaku" },
+ { startingYear: 1381, japaneseName: '氞埳', romanizedName: "Eitoku" },
+ { startingYear: 1384, japaneseName: 'è³åŸ³', romanizedName: "Shitoku" },
+ { startingYear: 1387, japaneseName: 'åæ
¶', romanizedName: "Kakei" },
+ { startingYear: 1389, japaneseName: '康å¿', romanizedName: "KÅÅ" },
+ { startingYear: 1390, japaneseName: 'æ埳', romanizedName: "Meitoku" },
+ { startingYear: 1394, japaneseName: 'å¿æ°ž', romanizedName: "Åei" },
+ { startingYear: 1428, japaneseName: 'æ£é·', romanizedName: "ShÅchÅ" },
+ { startingYear: 1429, japaneseName: '氞享', romanizedName: "EikyÅ" },
+ { startingYear: 1441, japaneseName: 'åå', romanizedName: "Kakitsu" },
+ { startingYear: 1444, japaneseName: 'æå®', romanizedName: "Bunnan" },
+ { startingYear: 1449, japaneseName: 'å®åŸ³', romanizedName: "HÅtoku" },
+ { startingYear: 1452, japaneseName: '享埳', romanizedName: "KyÅtoku" },
+ { startingYear: 1455, japaneseName: '康æ£', romanizedName: "KÅshÅ" },
+ { startingYear: 1457, japaneseName: 'é·çŠ', romanizedName: "ChÅroku" },
+ { startingYear: 1460, japaneseName: 'å¯æ£', romanizedName: "KanshÅ" },
+ { startingYear: 1466, japaneseName: 'ææ£', romanizedName: "BunshÅ" },
+ { startingYear: 1467, japaneseName: 'å¿ä»', romanizedName: "Ånin" },
+ { startingYear: 1469, japaneseName: 'ææ', romanizedName: "Bunmei" },
+ { startingYear: 1487, japaneseName: 'é·äº«', romanizedName: "ChÅkyÅ" },
+ { startingYear: 1489, japaneseName: '延埳', romanizedName: "Entoku" },
+ { startingYear: 1492, japaneseName: 'æå¿', romanizedName: "MeiÅ" },
+ { startingYear: 1501, japaneseName: 'æäº', romanizedName: "Bunki" },
+ { startingYear: 1504, japaneseName: 'æ°žæ£', romanizedName: "EishÅ" },
+ { startingYear: 1521, japaneseName: '倧氞', romanizedName: "Daiei" },
+ { startingYear: 1528, japaneseName: '享çŠ', romanizedName: "KyÅroku" },
+ { startingYear: 1532, japaneseName: '倩æ', romanizedName: "Tenbun" },
+ { startingYear: 1555, japaneseName: 'åŒæ²»', romanizedName: "KÅji" },
+ { startingYear: 1558, japaneseName: 'æ°žçŠ', romanizedName: "Eiroku" },
+ { startingYear: 1570, japaneseName: 'å
äº', romanizedName: "Genki" },
+ { startingYear: 1573, japaneseName: '倩æ£', romanizedName: "TenshÅ" },
+ { startingYear: 1592, japaneseName: 'æçŠ', romanizedName: "Bunroku" },
+ { startingYear: 1596, japaneseName: 'æ
¶é·', romanizedName: "KeichÅ" },
+ { startingYear: 1615, japaneseName: 'å
å', romanizedName: "Genna" },
+ { startingYear: 1624, japaneseName: 'å¯æ°ž', romanizedName: "Kan'ei" },
+ { startingYear: 1644, japaneseName: 'æ£ä¿', romanizedName: "ShÅhÅ" },
+ { startingYear: 1648, japaneseName: 'æ
¶å®', romanizedName: "Keian" },
+ { startingYear: 1652, japaneseName: 'æ¿å¿', romanizedName: "JÅÅ" },
+ { startingYear: 1655, japaneseName: 'ææŠ', romanizedName: "Meireki" },
+ { startingYear: 1658, japaneseName: 'äžæ²»', romanizedName: "Manji" },
+ { startingYear: 1661, japaneseName: 'å¯æ', romanizedName: "Kanbun" },
+ { startingYear: 1673, japaneseName: '延å®', romanizedName: "EnpÅ" },
+ { startingYear: 1681, japaneseName: '倩å', romanizedName: "Tenna" },
+ { startingYear: 1684, japaneseName: 'è²äº«', romanizedName: "JÅkyÅ" },
+ { startingYear: 1688, japaneseName: 'å
çŠ', romanizedName: "Genroku" },
+ { startingYear: 1704, japaneseName: 'å®æ°ž', romanizedName: "HÅei" },
+ { startingYear: 1711, japaneseName: 'æ£åŸ³', romanizedName: "ShÅtoku" },
+ { startingYear: 1716, japaneseName: '享ä¿', romanizedName: "KyÅhÅ" },
+ { startingYear: 1736, japaneseName: 'å
æ', romanizedName: "Genbun" },
+ { startingYear: 1741, japaneseName: 'å¯ä¿', romanizedName: "KanpÅ" },
+ { startingYear: 1744, japaneseName: '延享', romanizedName: "EnkyÅ" },
+ { startingYear: 1748, japaneseName: 'å¯å»¶', romanizedName: "Kan'en" },
+ { startingYear: 1751, japaneseName: 'å®æŠ', romanizedName: "HÅreki" },
+ { startingYear: 1764, japaneseName: 'æå', romanizedName: "Meiwa" },
+ { startingYear: 1772, japaneseName: 'å®æ°ž', romanizedName: "An'ei" },
+ { startingYear: 1781, japaneseName: '倩æ', romanizedName: "Tenmei" },
+ { startingYear: 1789, japaneseName: 'å¯æ¿', romanizedName: "Kansei" },
+ { startingYear: 1801, japaneseName: '享å', romanizedName: "KyÅwa" },
+ { startingYear: 1804, japaneseName: 'æå', romanizedName: "Bunka" },
+ { startingYear: 1818, japaneseName: 'ææ¿', romanizedName: "Bunsei" },
+ { startingYear: 1830, japaneseName: '倩ä¿', romanizedName: "TenpÅ" },
+ { startingYear: 1844, japaneseName: 'åŒå', romanizedName: "KÅka" },
+ { startingYear: 1848, japaneseName: 'åæ°ž', romanizedName: "Kaei" },
+ { startingYear: 1854, japaneseName: 'å®æ¿', romanizedName: "Ansei" },
+ { startingYear: 1860, japaneseName: 'äžå»¶', romanizedName: "Man'en" },
+ { startingYear: 1861, japaneseName: 'æä¹
', romanizedName: "Bunkyū" },
+ { startingYear: 1864, japaneseName: 'å
æ²»', romanizedName: "Genji" },
+ { startingYear: 1865, japaneseName: 'æ
¶å¿', romanizedName: "KeiÅ" },
+ { startingYear: 1868, japaneseName: 'ææ²»', romanizedName: "Meiji" },
+ { startingYear: 1912, japaneseName: '倧æ£', romanizedName: "TaishÅ" },
+ { startingYear: 1926, japaneseName: 'æå', romanizedName: "ShÅwa" },
+ { startingYear: 1989, japaneseName: 'å¹³æ', romanizedName: "Heisei" }
]
);
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
index 954c7a8..caef889 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/labellers.js
@@ -1,30 +1,30 @@
-/*==================================================
- * Localization of labellers.js
- *==================================================
- */
-
-Timeline.GregorianDateLabeller.monthNames["cs"] = [
- "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
-];
-
-Timeline.GregorianDateLabeller.dayNames["cs"] = [
- "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
-];
-
-Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
- var text;
- var emphasized = false;
-
- var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
-
- switch(intervalUnit) {
- case Timeline.DateTime.DAY:
- case Timeline.DateTime.WEEK:
- text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
- break;
- default:
- return this.defaultLabelInterval(date, intervalUnit);
- }
-
- return { text: text, emphasized: emphasized };
-};
+/*==================================================
+ * Localization of labellers.js
+ *==================================================
+ */
+
+Timeline.GregorianDateLabeller.monthNames["cs"] = [
+ "Leden", "Únor", "Bøezen", "Duben", "Kvìten", "Èerven", "Èervenec", "Srpen", "Záøí", "Øíjen", "Listopad", "Prosinec"
+];
+
+Timeline.GregorianDateLabeller.dayNames["cs"] = [
+ "Ne", "Po", "Út", "St", "Èt", "Pá", "So"
+];
+
+Timeline.GregorianDateLabeller.labelIntervalFunctions["cs"] = function(date, intervalUnit) {
+ var text;
+ var emphasized = false;
+
+ var date2 = Timeline.DateTime.removeTimeZoneOffset(date, this._timeZone);
+
+ switch(intervalUnit) {
+ case Timeline.DateTime.DAY:
+ case Timeline.DateTime.WEEK:
+ text = date2.getUTCDate() + ". " + (date2.getUTCMonth() + 1) + ".";
+ break;
+ default:
+ return this.defaultLabelInterval(date, intervalUnit);
+ }
+
+ return { text: text, emphasized: emphasized };
+};
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
index d823a51..21d41a4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/cs/timeline.js
@@ -1,9 +1,9 @@
-/*==================================================
- * Common localization strings
- *==================================================
- */
-
-Timeline.strings["cs"] = {
- wikiLinkLabel: "Diskuze"
-};
-
+/*==================================================
+ * Common localization strings
+ *==================================================
+ */
+
+Timeline.strings["cs"] = {
+ wikiLinkLabel: "Diskuze"
+};
+
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
index 378cda1..f4ec6ae 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/l10n/se/labellers.js
@@ -3,10 +3,10 @@
*==================================================
*/
-Timeline.GregorianDateLabeller.monthNames["se"] = [
- "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
+Timeline.GregorianDateLabeller.monthNames["se"] = [
+ "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
];
-Timeline.GregorianDateLabeller.dayNames["se"] = [
- "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
+Timeline.GregorianDateLabeller.dayNames["se"] = [
+ "Sön", "Mån", "Tis", "Ons", "Tors", "Fre", "Lör"
];
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
index 15ea379..00a3ff1 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/js/timeline/api/scripts/units.js
@@ -1,14 +1,14 @@
-/*==================================================
- * Default Unit
- *==================================================
- */
-
+/*==================================================
+ * Default Unit
+ *==================================================
+ */
+
Timeline.NativeDateUnit = new Object();
Timeline.NativeDateUnit.createLabeller = function(locale, timeZone) {
return new Timeline.GregorianDateLabeller(locale, timeZone);
};
-
+
Timeline.NativeDateUnit.makeDefaultValue = function() {
return new Date();
};
@@ -21,15 +21,15 @@ Timeline.NativeDateUnit.getParser = function(format) {
if (typeof format == "string") {
format = format.toLowerCase();
}
- return (format == "iso8601" || format == "iso 8601") ?
- Timeline.DateTime.parseIso8601DateTime :
- Timeline.DateTime.parseGregorianDateTime;
+ return (format == "iso8601" || format == "iso 8601") ?
+ Timeline.DateTime.parseIso8601DateTime :
+ Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject = function(o) {
return Timeline.DateTime.parseGregorianDateTime(o);
};
-
+
Timeline.NativeDateUnit.toNumber = function(v) {
return v.getTime();
};
commit c6b0b0e313458a866695afd28e4ef5a1c34ac8e4
Merge: 438a2f7... 117097f...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 21:46:01 2010 -0500
Merge branch 'bundle-jay' into bundle
commit 117097f0cf254b61d21f90d083c716cc14c24b6d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 21:45:22 2010 -0500
I'm not entirely sure about this change. mazz, maybe you can verify. But
unexepectedly these tests started failing. Looks like we needed a new
server plugin container to be added to the test env. I added one, but its
really just using the real one. Seems to get by.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
index 3833955..90aab2f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/TestBundleServerPluginService.java
@@ -46,6 +46,8 @@ import org.rhq.enterprise.server.plugin.pc.ServerPluginType;
import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginContainer;
import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginManager;
+import org.rhq.enterprise.server.plugin.pc.content.ContentServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.content.ContentServerPluginManager;
import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser;
import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType;
@@ -81,6 +83,7 @@ public class TestBundleServerPluginService extends ServerPluginService implement
ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1);
bundlePC = new TestBundleServerPluginContainer(this);
pcs.add(bundlePC);
+ pcs.add(new TestContentServerPluginContainer(this));
return pcs;
}
@@ -119,6 +122,18 @@ public class TestBundleServerPluginService extends ServerPluginService implement
}
}
+ public class TestContentServerPluginContainer extends ContentServerPluginContainer {
+ public TestContentServerPluginContainer(MasterServerPluginContainer master) {
+ super(master);
+ }
+
+ @Override
+ protected ServerPluginManager createPluginManager() {
+ ContentServerPluginManager pm = new ContentServerPluginManager(this);
+ return pm;
+ }
+ }
+
/**
* The test plugin manager.
*/
commit 438a2f796cd303ef89e20c454478d1f72bd5abab
Merge: 6d0672e... f48ec02...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:57:23 2010 -0500
Merge branch 'bundle-jay' into bundle
commit f48ec029df4eb0f84d3e7d4f2a0527fa50310173
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:56:08 2010 -0500
BundleManager CLI test script (note, some hardcoded win platform stuff
in the script currently)
diff --git a/modules/enterprise/remoting/scripts/src/test/resources/testBundle.war b/modules/enterprise/remoting/scripts/src/test/resources/testBundle.war
new file mode 100644
index 0000000..01377f3
Binary files /dev/null and b/modules/enterprise/remoting/scripts/src/test/resources/testBundle.war differ
diff --git a/modules/enterprise/remoting/webservices/src/main/scripts/rhq-client.build.xml b/modules/enterprise/remoting/webservices/src/main/scripts/rhq-client.build.xml
index 5bb03d4..00a3194 100644
--- a/modules/enterprise/remoting/webservices/src/main/scripts/rhq-client.build.xml
+++ b/modules/enterprise/remoting/webservices/src/main/scripts/rhq-client.build.xml
@@ -16,8 +16,8 @@
<property name="AlertManager" value="org.rhq.enterprise.server.alert.AlertManagerBean" />
<property name="AlertDefinitionManager" value="org.rhq.enterprise.server.alert.AlertDefinitionManagerBean" />
<property name="AvailabilityManager" value="org.rhq.enterprise.server.measurement.AvailabilityManagerBean" />
+ <property name="BundleManager" value="org.rhq.enterprise.server.bunde.BundleManagerBean" />
<property name="CallTimeDataManager" value="org.rhq.enterprise.server.measurement.CallTimeDataManagerBean" />
- <property name="RepoManager" value="org.rhq.enterprise.server.content.RepoManagerBean" />
<property name="ConfigurationManager" value="org.rhq.enterprise.server.configuration.ConfigurationManagerBean" />
<property name="ContentManager" value="org.rhq.enterprise.server.content.ContentManagerBean" />
<property name="DataAccessManager" value="org.rhq.enterprise.server.report.DataAccessManagerBean" />
@@ -29,6 +29,7 @@
<property name="MeasurementProblemManager" value="org.rhq.enterprise.server.measurement.MeasurementProblemManagerBean" />
<property name="MeasurementScheduleManager" value="org.rhq.enterprise.server.measurement.MeasurementScheduleManagerBean" />
<property name="OperationManager" value="org.rhq.enterprise.server.operation.OperationManagerBean" />
+ <property name="RepoManager" value="org.rhq.enterprise.server.content.RepoManagerBean" />
<property name="ResourceGroupManager" value="org.rhq.enterprise.server.resource.group.ResourceGroupManagerBean" />
<property name="ResourceManager" value="org.rhq.enterprise.server.resource.ResourceManagerBean" />
<property name="RoleManager" value="org.rhq.enterprise.server.authz.RoleManagerBean" />
commit f9e8695705a422c67e4aeb62558a54a07c42e50c
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:55:19 2010 -0500
Make the BundleManagerRemote available via WS
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index e91e9a1..0edf73e 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -28,7 +28,7 @@
var TestsEnabled = true;
-var bundleName "testScriptBundle"
+var bundleName = 'testScriptBundle';
// note, super-user, will not test any security constraints
var subject = rhq.login('rhqadmin', 'rhqadmin');
@@ -42,35 +42,53 @@ function testDeployment() {
return;
}
- var c = new BundleCriteria();
- c.addFilterName( bundleName );
- var bundles = BundleManager.findBundlesViaCriteria( c );
- if ( null != bundles && bundles.size > 0 ) {
+ // delete the test bundle if it exists
+ var bc = new BundleCriteria();
+ bc.addFilterName( bundleName );
+ var bundles = BundleManager.findBundlesByCriteria( bc );
+ if ( null != bundles && bundles.size() > 0 ) {
print( "\n Deleting existing testScriptBundle in order to test a fresh deploy...")
BundleManager.deleteBundle( bundles.get(0).getId() );
}
+
+ // create the test bundle
+ var testBundle = BundleManager.createBundle( bundleName, getBundleType() );
- var testBundle = createBundle( bundleName, getBundleType() );
- BundleVersion bv1 = createBundleVersion(bundleName, null, getBundleType());
- Configuration config = new Configuration();
- config.put(new PropertySimple("bundletest.property", "bundletest.property value"));
- BundleDeployDefinition bdd1 = createDeployDefinition("one", bv1, config);
- assertNotNull(bdd1);
- Resource platformResource = createTestResource();
- BundleScheduleResponse bsr = bundleManager.scheduleBundleDeployment(overlord, bdd1.getId(), platformResource
- .getId());
- assertNotNull(bsr);
- assertEquals(bdd1.getId(), bsr.getBundleDeployment().getBundleDeployDefinition().getId());
- assertEquals(platformResource.getId(), bsr.getBundleDeployment().getResource().getId());
+ // define the recipe for bundleVersion 1.0
+ var recipe = "file -s testBundle.war -d <%bundleTest.deployHome%>/testBundle.war"
+
+ // create bundleVersion 1.0
+ var testBundleVersion = BundleManager.createBundleVersion( testBundle.getId(), bundleName, null, recipe);
+
+ // add the single bundleFile, the test war file
+ var fileBytes = scriptUtil.getFileBytes("./src/test/resources/testBundle.war");
+ var bundleFile = BundleManager.addBundleFileViaByteArray(testBundleVersion.getId(), "testBundle.war",
+ "1.0", null, fileBytes, false);
+
+ // create the config, setting the required properties from the recipe
+ var config = new Configuration();
+ var property = new PropertySimple("bundleTest.deployHome", "C:/temp");
+ config.put( property );
+ // create a deploy def using the above config
+ var testDeployDef = BundleManager.createBundleDeployDefinition(testBundleVersion.getId(), "Windows Deployment", "Windows Deployment of testBundle WAR", config, false, -1, false);
+
+ // Find a target platform
+ var rc = new ResourceCriteria();
+ rc.addFilterResourceTypeName("win");
+ var winPlatforms = ResourceManager.findResourcesByCriteria(rc);
+ var platformId = winPlatforms.get(0).getId();
+
+ var bundleScheduleResponse = BundleManager.scheduleBundleDeployment(testDeployDef.getId(), platformId);
}
function getBundleType() {
var types = BundleManager.getAllBundleTypes();
- for ( int i=0; ( i < types.size()); ++i ) {
- if ( types.get(i).getName().toUppercase().contains("TEMPLATE") ) {
+ for (i=0; ( i < types.size()); ++i ) {
+ if ( types.get(i).getName().equals( "File Template Bundle" )) {
return types.get(i).getId();
+ }
}
print( "\n Could not find template bundle type, is the plugin loaded?");
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index a111f46..c62bf55 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -22,6 +22,7 @@
*/
package org.rhq.enterprise.server.webservices;
+import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.Map;
@@ -37,6 +38,13 @@ import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
@@ -66,6 +74,12 @@ import org.rhq.core.domain.content.transfer.EntitlementCertificate;
import org.rhq.core.domain.content.transfer.SubscribedRepo;
import org.rhq.core.domain.criteria.AlertCriteria;
import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
+import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
+import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+import org.rhq.core.domain.criteria.BundleFileCriteria;
+import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.criteria.Criteria;
import org.rhq.core.domain.criteria.EventCriteria;
import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria;
@@ -110,6 +124,7 @@ import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.auth.SubjectException;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.bundle.BundleManagerLocal;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.configuration.ConfigurationUpdateStillInProgressException;
import org.rhq.enterprise.server.content.AdvisoryException;
@@ -171,8 +186,8 @@ public class WebservicesManagerBean implements WebservicesRemote {
private AlertManagerLocal alertManager = LookupUtil.getAlertManager();
private AlertDefinitionManagerLocal alertDefinitionManager = LookupUtil.getAlertDefinitionManager();
private AvailabilityManagerLocal availabilityManager = LookupUtil.getAvailabilityManager();
+ private BundleManagerLocal bundleManager = LookupUtil.getBundleManager();
private CallTimeDataManagerLocal callTimeDataManager = LookupUtil.getCallTimeDataManager();
- private RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
private ConfigurationManagerLocal configurationManager = LookupUtil.getConfigurationManager();
private ContentManagerLocal contentManager = LookupUtil.getContentManager();
//removed as it is problematic for WS clients having XMLAny for Object.
@@ -187,6 +202,7 @@ public class WebservicesManagerBean implements WebservicesRemote {
private MeasurementProblemManagerLocal measurementProblemManager = LookupUtil.getMeasurementProblemManager();
private MeasurementScheduleManagerLocal measurementScheduleManager = LookupUtil.getMeasurementScheduleManager();
private OperationManagerLocal operationManager = LookupUtil.getOperationManager();
+ private RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
private ResourceFactoryManagerLocal resourceFactoryManager = LookupUtil.getResourceFactoryManager();
private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private ResourceGroupManagerLocal resourceGroupManager = LookupUtil.getResourceGroupManager();
@@ -313,6 +329,92 @@ public class WebservicesManagerBean implements WebservicesRemote {
//AVAILABILITYMANAGER: END ----------------------------------
+ //BUNDLEMANAGER: BEGIN ------------------------------------------
+
+ public BundleFile addBundleFile(Subject subject, int bundleVersionId, String name, String version,
+ Architecture architecture, InputStream fileStream, boolean pinToPackage) throws Exception {
+ return bundleManager.addBundleFile(subject, bundleVersionId, name, version, architecture, fileStream,
+ pinToPackage);
+ }
+
+ public BundleFile addBundleFileViaByteArray(Subject subject, int bundleVersionId, String name, String version,
+ Architecture architecture, byte[] fileBytes, boolean pinToPackage) throws Exception {
+ return bundleManager.addBundleFileViaByteArray(subject, bundleVersionId, name, version, architecture,
+ fileBytes, pinToPackage);
+ }
+
+ public BundleFile addBundleFileViaPackageVersion(Subject subject, int bundleVersionId, String name,
+ int packageVersionId, boolean pinToPackage) throws Exception {
+ return bundleManager.addBundleFileViaPackageVersion(subject, bundleVersionId, name, packageVersionId,
+ pinToPackage);
+ }
+
+ public Bundle createBundle(Subject subject, String name, int bundleTypeId) throws Exception {
+ return bundleManager.createBundle(subject, name, bundleTypeId);
+ }
+
+ public BundleDeployDefinition createBundleDeployDefinition(Subject subject, int bundleVersionId, String name,
+ String description, Configuration configuration, boolean enforcePolicy, int enforcementInterval,
+ boolean pinToBundle) throws Exception {
+ return bundleManager.createBundleDeployDefinition(subject, bundleVersionId, name, description, configuration,
+ enforcePolicy, enforcementInterval, pinToBundle);
+ }
+
+ public BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String bundleVersion,
+ String recipe) throws Exception {
+ return bundleManager.createBundleVersion(subject, bundleId, name, bundleVersion, recipe);
+ }
+
+ public void deleteBundle(Subject subject, int bundleId) throws Exception {
+ bundleManager.deleteBundle(subject, bundleId);
+ }
+
+ public void deleteBundleVersion(Subject subject, int bundleVersionId) throws Exception {
+ bundleManager.deleteBundleVersion(subject, bundleVersionId);
+ }
+
+ public PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
+ BundleDeployDefinitionCriteria criteria) {
+ return bundleManager.findBundleDeployDefinitionsByCriteria(subject, criteria);
+ }
+
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
+ BundleDeploymentHistoryCriteria criteria) {
+ return bundleManager.findBundleDeploymentHistoryByCriteria(subject, criteria);
+ }
+
+ public PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria) {
+ return bundleManager.findBundleDeploymentsByCriteria(subject, criteria);
+ }
+
+ public PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria) {
+ return bundleManager.findBundlesByCriteria(subject, criteria);
+ }
+
+ public PageList<BundleFile> findBundleFilesByCriteria(Subject subject, BundleFileCriteria criteria) {
+ return bundleManager.findBundleFilesByCriteria(subject, criteria);
+ }
+
+ public PageList<BundleVersion> findBundleVersionsByCriteria(Subject subject, BundleVersionCriteria criteria) {
+ return bundleManager.findBundleVersionsByCriteria(subject, criteria);
+ }
+
+ public List<BundleType> getAllBundleTypes(Subject subject) {
+ return bundleManager.getAllBundleTypes(subject);
+ }
+
+ public Set<String> getBundleVersionFilenames(Subject subject, int bundleVersionId, boolean withoutBundleFileOnly)
+ throws Exception {
+ return bundleManager.getBundleVersionFilenames(subject, bundleVersionId, withoutBundleFileOnly);
+ }
+
+ public BundleDeployment scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
+ throws Exception {
+ return bundleManager.scheduleBundleDeployment(subject, bundleDeployDefinitionId, resourceId);
+ }
+
+ //BUNDLEMANAGER: END ----------------------------------
+
//CALLTIMEDATAMANAGER: BEGIN ----------------------------------
public PageList<CallTimeDataComposite> findCallTimeDataForResource(Subject subject, int scheduleId, long beginTime,
long endTime, PageControl pc) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesRemote.java
index 8ddfc49..68a6691 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesRemote.java
@@ -8,6 +8,7 @@ import org.rhq.enterprise.server.alert.AlertDefinitionManagerRemote;
import org.rhq.enterprise.server.alert.AlertManagerRemote;
import org.rhq.enterprise.server.auth.SubjectManagerRemote;
import org.rhq.enterprise.server.authz.RoleManagerRemote;
+import org.rhq.enterprise.server.bundle.BundleManagerRemote;
import org.rhq.enterprise.server.configuration.ConfigurationManagerRemote;
import org.rhq.enterprise.server.content.AdvisoryManagerRemote;
import org.rhq.enterprise.server.content.ContentManagerRemote;
@@ -41,6 +42,7 @@ public interface WebservicesRemote extends //
AlertManagerRemote, //
AlertDefinitionManagerRemote, //
AvailabilityManagerRemote,//
+ BundleManagerRemote,//
CallTimeDataManagerRemote,//
RepoManagerRemote,//
EntitlementStuffManagerRemote, //
commit 755480e71cc4e935c13783305f702db35b5588ff
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:54:53 2010 -0500
A bunch of updates to support the bundle provisioning infrastructure.
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java
index 4226306..a82e866 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java
@@ -25,7 +25,6 @@ package org.rhq.core.clientapi.agent.bundle;
import java.io.Serializable;
-import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.util.exception.ThrowableUtil;
/**
@@ -35,7 +34,6 @@ public class BundleScheduleResponse implements Serializable {
private static final long serialVersionUID = 1L;
private String errorMessage;
- private BundleDeployment bundleDeployment;
public BundleScheduleResponse() {
}
@@ -56,14 +54,6 @@ public class BundleScheduleResponse implements Serializable {
this.errorMessage = ThrowableUtil.getAllMessages(t);
}
- public BundleDeployment getBundleDeployment() {
- return bundleDeployment;
- }
-
- public void setBundleDeployment(BundleDeployment bundleDeployment) {
- this.bundleDeployment = bundleDeployment;
- }
-
@Override
public String toString() {
StringBuilder str = new StringBuilder(this.getClass().getSimpleName());
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
index 02f4a5f..54fcc21 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/Bundle.java
@@ -83,7 +83,7 @@ public class Bundle implements Serializable {
private BundleType bundleType;
@JoinColumn(name = "REPO_ID", referencedColumnName = "ID", nullable = false)
- @OneToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)
+ @OneToOne(fetch = FetchType.LAZY, optional = false)
private Repo repo;
@OneToMany(mappedBy = "bundle", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
new file mode 100644
index 0000000..8341922
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleFileCriteria.java
@@ -0,0 +1,86 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.criteria;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.rhq.core.domain.bundle.BundleFile;
+
+/**
+ * @author Jay Shaughnessy
+ */
+@XmlRootElement
+(a)XmlAccessorType(XmlAccessType.FIELD)
+@SuppressWarnings("unused")
+public class BundleFileCriteria extends Criteria {
+ private static final long serialVersionUID = 1L;
+
+ private Integer filterId;
+ private Integer filterBundleVersionId; // needs override
+ private Integer filterPackageId; // needs override
+ private Integer filterPackageVersionId; // needs override
+
+ private boolean fetchBundleVersion;
+ private boolean fetchPackageVersion;
+ private boolean fetchPackage;
+
+ public BundleFileCriteria() {
+ super();
+
+ filterOverrides.put("bundleVersionId", "bundleVersion.id = ?");
+ filterOverrides.put("packageId", "generalPackage.id = ?");
+ filterOverrides.put("packageVersionId", "packageVersion.id = ?");
+ }
+
+ @Override
+ public Class<BundleFile> getPersistentClass() {
+ return BundleFile.class;
+ }
+
+ public void addFilterId(Integer filterId) {
+ this.filterId = filterId;
+ }
+
+ public void addFilterBundleVersionId(Integer filterBundleVersionId) {
+ this.filterBundleVersionId = filterBundleVersionId;
+ }
+
+ public void addFilterPackageId(Integer filterPackageId) {
+ this.filterPackageId = filterPackageId;
+ }
+
+ public void addFilterPackageVersionId(Integer filterPackageVersionId) {
+ this.filterPackageVersionId = filterPackageVersionId;
+ }
+
+ public void fetchBundleVersion(boolean fetchBundleVersion) {
+ this.fetchBundleVersion = fetchBundleVersion;
+ }
+
+ public void fetchPackage(boolean fetchPackage) {
+ this.fetchPackage = fetchPackage;
+ }
+
+ public void fetchPackageVersion(boolean fetchPackageVersion) {
+ this.fetchPackageVersion = fetchPackageVersion;
+ }
+}
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
index 4475be4..9bba46d 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/bundle/BundleManager.java
@@ -92,6 +92,7 @@ public class BundleManager extends AgentService implements BundleAgentService, B
}
public long getFileContent(PackageVersion packageVersion, OutputStream outputStream) throws Exception {
+ outputStream = remoteOutputStream(outputStream);
long size = getBundleServerService().downloadPackageBits(packageVersion, outputStream);
return size;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index b213501..be5a070 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -61,6 +61,7 @@ import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
@@ -77,6 +78,8 @@ import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
+import org.rhq.enterprise.server.util.HibernateDetachUtility;
+import org.rhq.enterprise.server.util.HibernateDetachUtility.SerializationType;
/**
* Manages the creation and usage of bundles.
@@ -118,7 +121,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public Bundle createBundle(Subject subject, String name, int bundleTypeId) {
+ public Bundle createBundle(Subject subject, String name, int bundleTypeId) throws Exception {
if (null == name || "".equals(name.trim())) {
throw new IllegalArgumentException("Invalid bundleName: " + name);
}
@@ -130,10 +133,12 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
Bundle bundle = new Bundle(name, bundleType);
- // add the implicit bundle repo
+ // create and add the required Repo. the Repo is a detached object ehich helps in its eventual
+ // removal.
Repo repo = new Repo(name);
repo.setCandidate(false);
repo.setSyncSchedule(null);
+ repo = repoManager.createRepo(subject, repo);
bundle.setRepo(repo);
log.info("Creating bundle: " + bundle);
@@ -279,6 +284,10 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
PackageVersion packageVersion = contentManager.createPackageVersion(name, packageType.getId(), version,
architecture.getId(), fileStream);
+ // set the PackageVersion's filename to the bundleFile name, it's left null by default
+ packageVersion.setFileName(name);
+ entityManager.merge(packageVersion);
+
// Create the mapping between the Bundle's Repo and the BundleFile's PackageVersion
Repo repo = bundle.getRepo();
repoManager.addPackageVersionsToRepo(subject, repo.getId(), new int[] { packageVersion.getId() });
@@ -350,7 +359,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public BundleScheduleResponse scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
+ public BundleDeployment scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception {
BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
@@ -362,18 +371,34 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resourceId);
}
+ // requires_new trans
BundleDeployment deployment = bundleManager.createBundleDeployment(subject, bundleDeployDefinitionId,
resourceId);
AgentClient agentClient = agentManager.getAgentClient(resourceId);
BundleAgentService bundleAgentService = agentClient.getBundleAgentService();
+ // make sure the deployDef contains the info required by the schedule service
+ BundleVersion bundleVersion = entityManager.find(BundleVersion.class, deployDef.getBundleVersion().getId());
+ Configuration config = entityManager.find(Configuration.class, deployDef.getConfiguration().getId());
+ Bundle bundle = entityManager.find(Bundle.class, bundleVersion.getBundle().getId());
+ BundleType bundleType = entityManager.find(BundleType.class, bundle.getBundleType().getId());
+ ResourceType resourceType = entityManager.find(ResourceType.class, bundleType.getResourceType().getId());
+ bundleType.setResourceType(resourceType);
+ bundle.setBundleType(bundleType);
+ bundleVersion.setBundle(bundle);
+ deployDef.setBundleVersion(bundleVersion);
+ deployDef.setConfiguration(config);
+ // now scrub the hibernate entity to make it a pojo suitable for sending to the client
+ HibernateDetachUtility.nullOutUninitializedFields(deployDef, SerializationType.SERIALIZATION);
BundleScheduleRequest request = new BundleScheduleRequest(deployDef);
BundleScheduleResponse response = bundleAgentService.schedule(request);
- if (null != response) {
- response.setBundleDeployment(deployment);
- }
- return response;
+ // we don't want to commit the scrubbed entities so clear the changes
+ this.entityManager.clear();
+
+ // TODO: Generate History based on the response
+
+ return deployment;
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@@ -493,6 +518,14 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return queryRunner.execute();
}
+ public PageList<BundleFile> findBundleFilesByCriteria(Subject subject, BundleFileCriteria criteria) {
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
+
+ CriteriaQueryRunner<BundleFile> queryRunner = new CriteriaQueryRunner<BundleFile>(criteria, generator,
+ entityManager);
+ return queryRunner.execute();
+ }
+
public PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria) {
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
@@ -504,17 +537,33 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void deleteBundle(Subject subject, int bundleId) throws Exception {
Bundle bundle = this.entityManager.find(Bundle.class, bundleId);
+ if (null == bundle) {
+ return;
+ }
+
+ for (BundleVersion bv : bundle.getBundleVersions()) {
+ bundleManager.deleteBundleVersion(subject, bv.getId());
+ }
+
+ // we need to whack the Repo once the Bundle no longe refers to it
+ Repo bundleRepo = bundle.getRepo();
+
this.entityManager.remove(bundle);
+ this.entityManager.flush();
+
+ repoManager.deleteRepo(subject, bundleRepo.getId());
}
- /*
- public void deleteBundleVersions(Subject subject, int[] bundleVersionIds) {
- for (int bundleVersionId : bundleVersionIds) {
- BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
- this.entityManager.remove(bundleVersion);
+ public void deleteBundleVersion(Subject subject, int bundleVersionId) {
+ BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
+ if (null == bundleVersion) {
+ return;
}
+
+ // remove the bundle version, this will cascade remove the deploy defs which will cascade remove
+ // the deployments.
+ this.entityManager.remove(bundleVersion);
}
- */
public BundleType createMockBundleType(Subject subject) {
@@ -528,7 +577,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
}
- public Bundle createMockBundle(Subject subject, List<BundleType> bundleTypes) {
+ public Bundle createMockBundle(Subject subject, List<BundleType> bundleTypes) throws Exception {
Random random = new Random();
BundleType bundleType;
if (bundleTypes.isEmpty()) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 467cec9..5b5f89e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -28,7 +28,6 @@ import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
-import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
@@ -43,6 +42,7 @@ import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+import org.rhq.core.domain.criteria.BundleFileCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.system.ServerVersion;
@@ -170,15 +170,24 @@ public interface BundleManagerRemote {
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleId") int bundleId) throws Exception;
+ /**
+ * Remove everything associated with the BundleVersion with the exception of files laid down by related deployments.
+ * Deployed files are left as is on the deployment platforms but the bundle mechanism will no longer track
+ * the deployment.
+ *
+ * @param subject
+ * @param bundleVersionId
+ * @throws Exception if any part of the removal fails.
+ */
@WebMethod
- PageList<Bundle> findBundlesByCriteria( //
+ void deleteBundleVersion( //
@WebParam(name = "subject") Subject subject, //
- @WebParam(name = "criteria") BundleCriteria criteria);
+ @WebParam(name = "bundleVersionId") int bundleVersionId) throws Exception;
@WebMethod
- PageList<BundleVersion> findBundleVersionsByCriteria( //
+ PageList<Bundle> findBundlesByCriteria( //
@WebParam(name = "subject") Subject subject, //
- @WebParam(name = "criteria") BundleVersionCriteria criteria);
+ @WebParam(name = "criteria") BundleCriteria criteria);
@WebMethod
PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria( //
@@ -187,7 +196,8 @@ public interface BundleManagerRemote {
@WebMethod
PageList<BundleDeployment> findBundleDeploymentsByCriteria( //
- @WebParam(name = "subject") Subject subject, BundleDeploymentCriteria criteria);
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "BundleDeploymentCriteria") BundleDeploymentCriteria criteria);
@WebMethod
// TODO is this necessary? Or do you just search for deployments and optionally fetch the history?
@@ -197,6 +207,16 @@ public interface BundleManagerRemote {
@WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
@WebMethod
+ PageList<BundleFile> findBundleFilesByCriteria( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "criteria") BundleFileCriteria criteria);
+
+ @WebMethod
+ PageList<BundleVersion> findBundleVersionsByCriteria( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "criteria") BundleVersionCriteria criteria);
+
+ @WebMethod
List<BundleType> getAllBundleTypes( //
@WebParam(name = "subject") Subject subject);
@@ -226,11 +246,11 @@ public interface BundleManagerRemote {
* @param subject must be InventoryManager
* @param bundleDeployDefinitionId the BundleDeployDefinition being used to guide the deployments
* @param resourceId the target resource (must exist), typically platforms, for the deployments
- * @return the BundleScheduleResponse created to track the deployment.
+ * @return the BundleDeployment created to track the deployment.
* @throws Exception
*/
@WebMethod
- BundleScheduleResponse scheduleBundleDeployment( //
+ BundleDeployment scheduleBundleDeployment( //
@WebParam(name = "subject") Subject subject, //
@WebParam(name = "bundleDeployDefinitionId") int bundleDeployDefinitionId, //
@WebParam(name = "resourceId") int resourceId) throws Exception;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
index 71d038c..c79e585 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleServerServiceImpl.java
@@ -29,12 +29,15 @@ import org.rhq.core.clientapi.server.bundle.BundleServerService;
import org.rhq.core.clientapi.server.bundle.BundleStatusUpdate;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.BundleFile;
-import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.content.PackageVersion;
-import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.criteria.BundleFileCriteria;
+import org.rhq.core.domain.criteria.PackageVersionCriteria;
import org.rhq.core.util.exception.WrappedRemotingException;
+import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
+import org.rhq.enterprise.server.util.HibernateDetachUtility;
import org.rhq.enterprise.server.util.LookupUtil;
+import org.rhq.enterprise.server.util.HibernateDetachUtility.SerializationType;
/**
* Server-side implementation of the <code>BundleServerService</code>. This implmentation simply forwards
@@ -52,15 +55,21 @@ public class BundleServerServiceImpl implements BundleServerService {
public List<PackageVersion> getAllBundleVersionPackageVersions(int bundleVersionId) {
try {
BundleManagerLocal bm = LookupUtil.getBundleManager();
- BundleVersionCriteria c = new BundleVersionCriteria();
+ ContentManagerLocal cm = LookupUtil.getContentManager();
Subject subject = LookupUtil.getSubjectManager().getOverlord();
- c.addFilterId(bundleVersionId);
- c.fetchBundleFiles(true);
- List<BundleVersion> bundleVersions = bm.findBundleVersionsByCriteria(subject, c);
- List<BundleFile> bundleFiles = bundleVersions.get(0).getBundleFiles();
+ BundleFileCriteria bfc = new BundleFileCriteria();
+ PackageVersionCriteria pvc = new PackageVersionCriteria();
+
+ bfc.addFilterBundleVersionId(bundleVersionId);
+ bfc.fetchPackageVersion(true);
+ List<BundleFile> bundleFiles = bm.findBundleFilesByCriteria(subject, bfc);
List<PackageVersion> packageVersions = new ArrayList<PackageVersion>(bundleFiles.size());
+ PackageVersion packageVersion = null;
for (BundleFile bundleFile : bundleFiles) {
- packageVersions.add(bundleFile.getPackageVersion());
+ pvc.addFilterId(bundleFile.getPackageVersion().getId());
+ packageVersion = cm.findPackageVersionsByCriteria(subject, pvc).get(0);
+ HibernateDetachUtility.nullOutUninitializedFields(packageVersion, SerializationType.SERIALIZATION);
+ packageVersions.add(packageVersion);
}
return packageVersions;
} catch (Exception e) {
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 49d51db..f331210 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -35,7 +35,6 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
@@ -310,11 +309,10 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
BundleDeployDefinition bdd1 = createDeployDefinition("one", bv1, config);
assertNotNull(bdd1);
Resource platformResource = createTestResource();
- BundleScheduleResponse bsr = bundleManager.scheduleBundleDeployment(overlord, bdd1.getId(), platformResource
- .getId());
- assertNotNull(bsr);
- assertEquals(bdd1.getId(), bsr.getBundleDeployment().getBundleDeployDefinition().getId());
- assertEquals(platformResource.getId(), bsr.getBundleDeployment().getResource().getId());
+ BundleDeployment bd = bundleManager.scheduleBundleDeployment(overlord, bdd1.getId(), platformResource.getId());
+ assertNotNull(bd);
+ assertEquals(bdd1.getId(), bd.getBundleDeployDefinition().getId());
+ assertEquals(platformResource.getId(), bd.getResource().getId());
}
@Test(enabled = TESTS_ENABLED)
commit 3cd4671ddfeacbaa5e9d9845804f07e837951cdb
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:54:02 2010 -0500
Fix problem preventing CLI from loading the remote manager
(illegal class use)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index b211ec2..dbd2395 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -24,7 +24,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.Map.Entry;
import javax.ejb.EJB;
import javax.ejb.Stateless;
@@ -993,7 +992,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
invalidConfig, subject.getName());
resourceConfigurationUpdate.setErrorMessage("resource.validation.failed");
resourceConfigurationUpdate.setStatus(ConfigurationUpdateStatus.FAILURE);
-
+
return resourceConfigurationUpdate;
}
} catch (PluginContainerException e) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java
index 4d834fd..74bfdc4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerRemote.java
@@ -29,7 +29,6 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.jetbrains.annotations.Nullable;
-import org.rhq.core.clientapi.agent.PluginContainerException;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.Configuration;
@@ -182,13 +181,9 @@ public interface ConfigurationManagerRemote {
throws ResourceNotFoundException, ConfigurationUpdateStillInProgressException;
@WebMethod
- ResourceConfigurationUpdate updateStructuredOrRawConfiguration(
- @WebParam Subject subject,
- @WebParam int resourceId,
- @WebParam
- @XmlJavaTypeAdapter(ConfigurationAdapter.class) Configuration newConfiguration,
- @WebParam boolean fromStructured)
- throws ResourceNotFoundException, ConfigurationUpdateStillInProgressException, PluginContainerException;
+ ResourceConfigurationUpdate updateStructuredOrRawConfiguration(@WebParam Subject subject, @WebParam int resourceId,
+ @WebParam @XmlJavaTypeAdapter(ConfigurationAdapter.class) Configuration newConfiguration,
+ @WebParam boolean fromStructured) throws ResourceNotFoundException, ConfigurationUpdateStillInProgressException;
/**
* Get the currently live resource configuration for the {@link Resource} with the given id. This actually asks for
commit 79eb68cf9d09fb361889fb6a993a253c2ba00452
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:51:35 2010 -0500
add missing remote to RemoteClient
diff --git a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
index a1a5b38..ed4fd00 100644
--- a/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
+++ b/modules/enterprise/remoting/client-api/src/main/java/org/rhq/enterprise/client/RemoteClient.java
@@ -405,6 +405,10 @@ public class RemoteClient {
return RemoteClientProxy.getProcessor(this, Manager.RoleManager);
}
+ public SavedSearchManagerRemote getSavedSearchManagerRemote() {
+ return RemoteClientProxy.getProcessor(this, Manager.SavedSearchManager);
+ }
+
public SubjectManagerRemote getSubjectManagerRemote() {
return RemoteClientProxy.getProcessor(this, Manager.SubjectManager);
}
commit eb1a1aacef3a15150fa5c1206527a69d318515ac
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:50:40 2010 -0500
Fix a problem executing the test scripts
diff --git a/modules/enterprise/remoting/scripts/pom.xml b/modules/enterprise/remoting/scripts/pom.xml
index cbe2b82..e1d9eb9 100644
--- a/modules/enterprise/remoting/scripts/pom.xml
+++ b/modules/enterprise/remoting/scripts/pom.xml
@@ -51,6 +51,12 @@
<groupId>jboss</groupId>
<artifactId>jboss-j2ee</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>oswego-concurrent</groupId>
+ <artifactId>concurrent</artifactId>
+ </dependency>
+
</dependencies>
<build>
commit f6a2d7c7e5828d02372305861593335e39710476
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Mar 9 18:48:00 2010 -0500
add getopt dep and jar packaging
diff --git a/modules/plugins/filetemplate-bundle/pom.xml b/modules/plugins/filetemplate-bundle/pom.xml
index 93f1c4c..b79645d 100644
--- a/modules/plugins/filetemplate-bundle/pom.xml
+++ b/modules/plugins/filetemplate-bundle/pom.xml
@@ -32,6 +32,11 @@
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>gnu-getopt</groupId>
+ <artifactId>getopt</artifactId>
+ </dependency>
+
</dependencies>
<build>
@@ -56,6 +61,11 @@
<version>${project.version}</version>
</artifactItem>
+ <artifactItem>
+ <groupId>gnu-getopt</groupId>
+ <artifactId>getopt</artifactId>
+ </artifactItem>
+
</artifactItems>
<outputDirectory>${project.build.outputDirectory}/lib</outputDirectory>
</configuration>
commit 8ba41d544b33647b7221f051258f67a562926a23
Merge: b990924... c2723d3...
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Mar 9 15:02:32 2010 -0500
Merge branch 'master' into search
commit b990924232705925fd82be147059d649c5512502
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Mar 9 14:56:35 2010 -0500
fix monkey script
diff --git a/scripts/ignore-target-dirs.js b/scripts/ignore-target-dirs.js
index 97af1b7..9adce6a 100644
--- a/scripts/ignore-target-dirs.js
+++ b/scripts/ignore-target-dirs.js
@@ -13,8 +13,8 @@ function main() {
}
}
- files = resources.filesMatching(".*/dev-container/jbossas/bin/run.sh");
+ files = resources.filesMatching(".*/dev-container/jbossas/bin/run\\.sh");
for each( file in files ) {
- file.eclipseObject.parent.parent.parent.setDerived(true);
+ file.eclipseObject.parent.parent.parent.setDerived(true);
}
}
\ No newline at end of file
commit ecb1afe5f24821ef7de5c23df2c9c48f0bd84dc7
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Mar 9 14:56:11 2010 -0500
preliminary search assist and execution support for resource subsystem
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
index dd943e0..dd96d77 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
@@ -70,6 +70,8 @@ public abstract class Criteria implements Serializable {
private Class<?> persistentClass;
+ private String searchExpression;
+
//added no args constructor for bean and JAXB requirement
@SuppressWarnings("unused")
private Criteria() {
@@ -233,6 +235,14 @@ public abstract class Criteria implements Serializable {
return this.strict;
}
+ public void setSearchExpression(String searchExpression) {
+ this.searchExpression = searchExpression;
+ }
+
+ public String getSearchExpression() {
+ return this.searchExpression;
+ }
+
/** subclasses should override as necessary */
public boolean isInventoryManagerRequired() {
return false;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java
index bd70b6f..6052b4c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java
@@ -26,7 +26,7 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import org.rhq.core.domain.search.SavedSearch;
-import org.rhq.core.domain.search.SearchContext;
+import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.core.domain.util.PageOrdering;
/**
@@ -38,7 +38,7 @@ public class SavedSearchCriteria extends Criteria {
public static final long serialVersionUID = 1L;
private Integer filterId;
- private SearchContext filterContext;
+ private SearchSubsystem filterContext;
private String filterName;
private String filterDescription;
private String filterPattern;
@@ -70,7 +70,7 @@ public class SavedSearchCriteria extends Criteria {
this.filterId = filterId;
}
- public void addFilterSearchContext(SearchContext filterContext) {
+ public void addFilterSearchContext(SearchSubsystem filterContext) {
this.filterContext = filterContext;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/search/SavedSearch.java b/modules/core/domain/src/main/java/org/rhq/core/domain/search/SavedSearch.java
index d6b50e7..a9d4ff1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/search/SavedSearch.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/search/SavedSearch.java
@@ -64,7 +64,7 @@ public class SavedSearch {
@Column(name = "CONTEXT", nullable = false)
@Enumerated(EnumType.STRING)
- private SearchContext context;
+ private SearchSubsystem context;
@Column(name = "NAME")
private String name;
@@ -97,7 +97,7 @@ public class SavedSearch {
// no-arg ctor for Hibernate
}
- public SavedSearch(SearchContext context, String name, String pattern, Subject subject) {
+ public SavedSearch(SearchSubsystem context, String name, String pattern, Subject subject) {
// call setters to go through parameter validation
setContext(context);
setPattern(pattern);
@@ -119,11 +119,11 @@ public class SavedSearch {
this.id = id;
}
- public SearchContext getContext() {
+ public SearchSubsystem getContext() {
return context;
}
- private void setContext(SearchContext context) {
+ private void setContext(SearchSubsystem context) {
if (context == null) {
throw new IllegalArgumentException("All saved searches must be bound to a SearchContext");
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchContext.java b/modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchContext.java
deleted file mode 100644
index bb045d5..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchContext.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2, as
- * published by the Free Software Foundation, and/or the GNU Lesser
- * General Public License, version 2.1, also as published by the Free
- * Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License and the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License
- * and the GNU Lesser General Public License along with this program;
- * if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.rhq.core.domain.search;
-
-/**
- * The search mechanism is generic and, thus, suited to finding data in any
- * RHQ subsystem, including its own. Each individual page in the UI can have
- * different advanced syntax. This enum will serve as a unique identifier
- * for which context is currently active. You can think of it as a piece of
- * meta-data that annotates each saved search, representing which context it
- * belongs to. This will also affect which grammar is used to auto-complete
- * search expressions.
- *
- * @author Joseph Marques
- */
-public enum SearchContext {
- Resource, Group;
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchSubsystem.java b/modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchSubsystem.java
new file mode 100644
index 0000000..a834833
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/search/SearchSubsystem.java
@@ -0,0 +1,66 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.domain.search;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.rhq.core.domain.resource.group.ResourceGroup;
+
+/**
+ * The search mechanism is generic and, thus, suited to finding data in any
+ * RHQ subsystem, including its own. Each individual page in the UI can have
+ * different advanced syntax. This enum will serve as a unique identifier
+ * for which subsystem is currently active. You can think of it as a piece of
+ * meta-data that annotates each saved search, representing which context it
+ * belongs to. This will also affect which grammar is used to auto-complete
+ * search expressions.
+ *
+ * @author Joseph Marques
+ */
+public enum SearchSubsystem {
+
+ Resource(org.rhq.core.domain.resource.Resource.class), //
+ Group(ResourceGroup.class);
+
+ private Class<?> entityClass;
+ private static Map<Class<?>, SearchSubsystem> subsystems;
+ static {
+ subsystems = new HashMap<Class<?>, SearchSubsystem>();
+ for (SearchSubsystem next : SearchSubsystem.values()) {
+ SearchSubsystem.subsystems.put(next.entityClass, next);
+ }
+ }
+
+ private SearchSubsystem(Class<?> entityClass) {
+ this.entityClass = entityClass;
+ }
+
+ public Class<?> getEntityClass() {
+ return this.entityClass;
+ }
+
+ public static SearchSubsystem get(Class<?> entityClass) {
+ return SearchSubsystem.subsystems.get(entityClass);
+ }
+}
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 52f40e5..cd31a4d 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,6 +1,5 @@
package org.rhq.enterprise.gui.inventory.browse;
-import java.util.ArrayList;
import java.util.List;
import javax.faces.model.DataModel;
@@ -11,14 +10,16 @@ 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;
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.gui.inventory.browse.BrowseResourcesUIBean.Suggestion;
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;
public class BrowseGroupsUIBean extends PagedDataTableUIBean {
@@ -85,10 +86,15 @@ public class BrowseGroupsUIBean extends PagedDataTableUIBean {
}
}
- public List<Suggestion> autocomplete(Object suggest) {
+ SearchAssistManager searchAssist = new SearchAssistManager(SearchSubsystem.Group);
+
+ public List<SearchSuggestion> autocomplete(Object suggest) {
String currentInputText = (String) suggest;
- List<Suggestion> results = new ArrayList<Suggestion>();
+
+ List<SearchSuggestion> suggestions = searchAssist.getAdvancedSuggestions(currentInputText, currentInputText
+ .length());
+
// offer suggestions based on currentInputText
- return results;
+ return suggestions;
}
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseResourcesUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseResourcesUIBean.java
index 4275a63..074cd3a 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseResourcesUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseResourcesUIBean.java
@@ -1,9 +1,9 @@
package org.rhq.enterprise.gui.inventory.browse;
-import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
+import javax.faces.component.html.HtmlInputText;
import javax.faces.model.DataModel;
import org.apache.commons.logging.Log;
@@ -13,6 +13,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.composite.ResourceComposite;
+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;
@@ -23,6 +24,9 @@ import org.rhq.enterprise.gui.common.paging.PageControlView;
import org.rhq.enterprise.gui.common.paging.ResourceNameDisambiguatingPagedListDataModel;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.search.execution.SearchAssistManager;
+import org.rhq.enterprise.server.search.execution.SearchSuggestion;
+import org.rhq.enterprise.server.util.HibernatePerformanceMonitor;
import org.rhq.enterprise.server.util.LookupUtil;
public class BrowseResourcesUIBean extends PagedDataTableUIBean {
@@ -31,6 +35,7 @@ public class BrowseResourcesUIBean extends PagedDataTableUIBean {
public static final String MANAGED_BEAN_NAME = "BrowseResourcesUIBean";
private String filter;
+ private HtmlInputText filterInput;
private ResourceCategory category;
private static final IntExtractor<ResourceComposite> RESOURCE_ID_EXTRATOR = new IntExtractor<ResourceComposite>() {
@@ -86,10 +91,10 @@ public class BrowseResourcesUIBean extends PagedDataTableUIBean {
ResourceCriteria criteria = new ResourceCriteria();
criteria.setPageControl(pc);
- if (filter != null && !filter.equals("")) {
- criteria.addFilterName(filter);
- }
criteria.addFilterResourceCategory(category);
+ if (filter != null && !filter.trim().equals("")) {
+ criteria.setSearchExpression(filter);
+ }
criteria.fetchParentResource(true);
PageList<ResourceComposite> results;
@@ -122,29 +127,25 @@ public class BrowseResourcesUIBean extends PagedDataTableUIBean {
return FacesContextUtility.getRequest().getParameterValues("selectedItems");
}
- public class Suggestion {
- String label;
- String value;
+ SearchAssistManager searchAssist = new SearchAssistManager(SearchSubsystem.Resource);
- public Suggestion(String label, String value) {
- this.label = label;
- this.value = value;
- }
+ public List<SearchSuggestion> autocomplete(Object suggest) {
+ String currentInputText = (String) suggest;
- public String getLabel() {
- return label;
- }
+ // assume caret at the end of the input
+ long id = HibernatePerformanceMonitor.get().start();
+ List<SearchSuggestion> suggestions = searchAssist.getAdvancedSuggestions(currentInputText, currentInputText
+ .length());
+ HibernatePerformanceMonitor.get().stop(id, "ResourceSuggestions");
+ return suggestions;
+ }
- public String getValue() {
- return value;
- }
+ public HtmlInputText getFilterInput() {
+ return filterInput;
}
- public List<Suggestion> autocomplete(Object suggest) {
- String currentInputText = (String) suggest;
- List<Suggestion> results = new ArrayList<Suggestion>();
- // offer suggestions based on currentInputText
- return results;
+ public void setFilterInput(HtmlInputText filterInput) {
+ this.filterInput = filterInput;
}
}
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseResources.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseResources.xhtml
index 7890d64..ac11225 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseResources.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseResources.xhtml
@@ -36,24 +36,26 @@
<p/>
<h:panelGroup>
<h:outputLabel for="filter" value="Search: " />
- <h:inputText id="filter" value="#{BrowseResourcesUIBean.filter}"
+ <h:inputText id="filter"
+ binding="#{BrowseResourcesUIBean.filterInput}"
+ value="#{BrowseResourcesUIBean.filter}"
onkeypress="return ignoreEnterKey(event);"
style="width: 600px;" />
<rich:suggestionbox id="suggest" for="filter"
- tokens=",[]"
width="600" height="400"
border="1" cellpadding="1" cellspacing="1"
minChars="0"
first="0" rows="10"
- frequency="0.1"
+ frequency="0"
var="suggestItem"
fetchValue="#{suggestItem.value}"
+ selfRendered="true"
suggestionAction="#{BrowseResourcesUIBean.autocomplete}"
nothingLabel="Start typing for simple text matches"
usingSuggestObjects="true"
eventsQueue="resourceSearchSuggestions"
ignoreDupResponses="true"
- rendered="false"> <!-- disable until auto-completer is added -->
+ rendered="true"> <!-- disable until auto-completer is added -->
<h:column>
<h:outputText value="#{suggestItem.label}" />
</h:column>
@@ -61,6 +63,7 @@
<rich:spacer/>
<a4j:commandButton value="GO"
reRender="browseResourcesDataTable, browseResourcesDataTableScroller"
+ status="commonStatus"
actionListener="#{BrowseResourcesUIBean.clearDataModel}"
styleClass="buttonmed">
<s:defaultAction/>
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml
index 533c0e9..1123ff8 100644
--- a/modules/enterprise/server/jar/pom.xml
+++ b/modules/enterprise/server/jar/pom.xml
@@ -371,7 +371,7 @@
<groupId>org.antlr</groupId>
<artifactId>antlr</artifactId>
<version>3.2</version>
- <scope>compile</scope>
+
</dependency>
</dependencies>
diff --git a/modules/enterprise/server/jar/src/main/antlr3/org/rhq/enterprise/server/search/RHQL.g b/modules/enterprise/server/jar/src/main/antlr3/org/rhq/enterprise/server/search/RHQL.g
index ded91a1..b8ff97e 100644
--- a/modules/enterprise/server/jar/src/main/antlr3/org/rhq/enterprise/server/search/RHQL.g
+++ b/modules/enterprise/server/jar/src/main/antlr3/org/rhq/enterprise/server/search/RHQL.g
@@ -57,13 +57,9 @@ tokens {
OP_EQUALS;
OP_EQUALS_STRICT;
- OP_NULL;
- OP_IN;
OP_NOT_EQUALS;
OP_NOT_EQUALS_STRICT;
- OP_NOT_NULL;
- OP_NOT_IN;
}
@header {
@@ -83,49 +79,40 @@ searchExpression
;
conditionalExpression
- : conds+=conditionalFactor ( WS* ( 'or' ) WS* conds+=conditionalFactor )* -> { $conds.size() == 1 }? ^($conds)
- -> ^(OR conditionalFactor+)
+ : conds+=conditionalFactor ( WS+ ( 'or' | '|' ) WS+ conds+=conditionalFactor )* -> { $conds.size() == 1 }? ^($conds)
+ -> ^(OR conditionalFactor+)
; // use rewrite predicates to eliminate superfluous 'or' node if only one child
conditionalFactor
- : conds+=conditionalPrimary ( WS* ( 'and' WS* )? conds+=conditionalPrimary )* -> { $conds.size() == 1 }? ^($conds)
- -> ^(AND conditionalPrimary+)
+ : conds+=conditionalPrimary ( WS+ conds+=conditionalPrimary )* -> { $conds.size() == 1 }? ^($conds)
+ -> ^(AND conditionalPrimary+)
; // use rewrite predicates to eliminate superfluous 'and' node if only one child
conditionalPrimary
- : WS* simpleConditionalExpression WS* -> simpleConditionalExpression
- | '(' WS* conditionalExpression WS* ')' -> conditionalExpression
+ : WS* simpleConditionalExpression -> simpleConditionalExpression
+ | '(' WS* conditionalExpression WS* ')' -> conditionalExpression
; // avoid building nodes for parens, tree structure implies existence appropriately -- ignore captured WS
simpleConditionalExpression
- : comparisonConditionalExpression
- | nullComparisonConditionalExpression
- | inExpression
- ;
-
-comparisonConditionalExpression
- : c=context WS* op=comparisonOperator WS* ident=identifier -> ^($op $c ^(VALUE $ident))
- ; // rewrite tree output so operator is always the root -- ignore captured WS
-
-nullComparisonConditionalExpression
- : c=context WS* op=nullOperator -> ^($op $c)
- ; // rewrite tree output so operator is always the root -- ignore captured WS
-
-inExpression
- : c=context WS* op=inOperator WS* '[' WS* ids+=identifier WS* ( ',' WS* ids+=identifier WS* )* ']'
- -> ^($op $c ^(VALUE $ids+))
+ : c=context WS* op=comparisonOperator WS* ident=identifier -> ^($op $c ^(VALUE $ident))
; // rewrite tree output so operator is always the root -- ignore captured WS
context
- : ( l=lineage '.' )? p=path ( '[' ident=identifier ']' )? -> ^(CONTEXT ^(LINEAGE $l)? ^(PATH $p) ^(PARAM $ident)?)
+ : ( l=lineage '.' )? p=path ( '[' ident=parameter ']' )? -> ^(CONTEXT ^(LINEAGE $l)? ^(PATH $p) ^(PARAM $ident)?)
;
lineage
- : path ( '('! LEVEL ')'! )?
+ : path ( '['! LEVEL ']'! )?
; // avoid building nodes for brackets, tree structure implies existence appropriately
path
- : ID+
+ : ( 'or' | ID )+
+ ; // path is any character or token...
+
+parameter
+ : doubleQuotedValue -> ^(IDENT doubleQuotedValue)
+ | quotedValue -> ^(IDENT quotedValue)
+ | boundedValue -> ^(IDENT boundedValue)
;
identifier
@@ -143,9 +130,13 @@ quotedValue
: '\''! ~('\'')* '\''!
; // avoid building nodes for the sinngle-quote characters
+boundedValue
+ : ~( ']' | WS )*
+ ; // consume until we find a whitespace char or ']' to terminate the current phrase
+
openEndedvalue
- : ~(']' | ',' | ')' | '(' | 'or' | 'and' | WS )*
- ; // consume until we find a char to terminate the current phrase ']' ',' ')' or begin the next '(' 'or' 'and'
+ : ~( '(' | ')' | WS )*
+ ; // consume until we find a whitespace char to ')' terminate the current phrase, or '(' begin the next phrase
comparisonOperator
: '=' -> ^(OP_EQUALS)
@@ -154,26 +145,20 @@ comparisonOperator
| '!==' -> ^(OP_NOT_EQUALS_STRICT)
; // use imaginary nodes for all operators, which further removes the AST from the real lexical elements
-nullOperator
- : 'is' WS+ (negation='not' WS+)? 'null' -> { $negation == null }? ^(OP_NULL)
- -> ^(OP_NOT_NULL)
- ; // use imaginary nodes for all operators, which further removes the AST from the real lexical elements
-
-inOperator
- : (negation+='not' WS+)? 'in' -> { $negation == null }? ^(OP_IN)
- -> ^(OP_NOT_IN)
- ; // use imaginary nodes for all operators, which further removes the AST from the real lexical elements
-
/*
* lexical elements
*/
ID
- : 'a'..'z'
+ : 'a'..'z' | 'A'..'Z'
;
LEVEL
- : '0'..'5'
+ : '0'..'9'
+ ;
+
+SYMBOL
+ : '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '-' | '_' | '+' | '|' | '?' | '/' | ',' | '<' | '>' | '`' | '~'
;
WS
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNode.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNode.java
new file mode 100644
index 0000000..092863e
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNode.java
@@ -0,0 +1,11 @@
+package org.rhq.enterprise.server.search.antlr;
+
+import org.antlr.runtime.Token;
+import org.antlr.runtime.tree.CommonTree;
+
+public class RHQLNode extends CommonTree {
+
+ public RHQLNode(Token t) {
+ super(t);
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNodeAdaptor.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNodeAdaptor.java
new file mode 100644
index 0000000..9f20c16
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/antlr/RHQLNodeAdaptor.java
@@ -0,0 +1,34 @@
+package org.rhq.enterprise.server.search.antlr;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.antlr.runtime.NoViableAltException;
+import org.antlr.runtime.RecognitionException;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.TokenStream;
+import org.antlr.runtime.tree.CommonTreeAdaptor;
+
+public class RHQLNodeAdaptor extends CommonTreeAdaptor {
+ List<String> errorMessages = new ArrayList<String>();
+
+ @Override
+ public Object create(Token payload) {
+ return new RHQLNode(payload);
+ }
+
+ @Override
+ public Object errorNode(TokenStream input, Token start, Token stop, RecognitionException e) {
+ if (e instanceof NoViableAltException) {
+ NoViableAltException noAlt = (NoViableAltException) e;
+ String description = noAlt.grammarDecisionDescription;
+ int position = noAlt.index;
+ errorMessages.add(description + ":" + position);
+ }
+ return super.errorNode(input, start, stop, e);
+ }
+
+ public List<String> getErrorMessages() {
+ return errorMessages;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/AbstractSearchAssistant.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/AbstractSearchAssistant.java
new file mode 100644
index 0000000..90c790f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/AbstractSearchAssistant.java
@@ -0,0 +1,131 @@
+package org.rhq.enterprise.server.search.assist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.Query;
+
+import org.rhq.enterprise.server.util.LookupUtil;
+
+public abstract class AbstractSearchAssistant implements SearchAssistant {
+
+ @Override
+ public List<String> getSimpleContexts() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<String> getParameterizedContexts() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<String> getParameters(String context, String filter) {
+ if (getParameterizedContexts().contains(context) == false) {
+ throw new IllegalArgumentException("context[" + context
+ + "] is not parameterized, no completions available");
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<String> getValues(String context, String param, String filter) {
+ if (getSimpleContexts().contains(context) && param != null) {
+ throw new IllegalArgumentException("context[" + context + "] is simple, param[" + param
+ + "] can not be handled");
+ }
+ if (getParameterizedContexts().contains(context) && param == null) {
+ throw new IllegalArgumentException("context[" + context + "] is parameterized, param must not be null");
+ }
+ return Collections.emptyList();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected final List<String> execute(String jpql) {
+ Query query = LookupUtil.getEntityManager().createQuery(jpql);
+ query.setMaxResults(20);
+ List<String> results = query.getResultList();
+ return results;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected final Map<String, List<String>> executeMap(String jpql) {
+ Query query = LookupUtil.getEntityManager().createQuery(jpql);
+ List<Object[]> rawResults = query.getResultList();
+ Map<String, List<String>> results = new HashMap<String, List<String>>();
+ for (Object[] nextTuple : rawResults) {
+ String key = (String) nextTuple[0];
+ String value = (String) nextTuple[1];
+ List<String> valueList = results.get(key);
+ if (valueList == null) {
+ valueList = new ArrayList<String>();
+ results.put(key, valueList);
+ }
+ valueList.add(value);
+ }
+ return results;
+ }
+
+ protected final String add(String fragment, String parameter) {
+ if (!parameter.equals("")) {
+ return fragment;
+ }
+ return "";
+ }
+
+ protected final List<String> filter(Class<? extends Enum<?>> enumType, String filter) {
+ List<String> results = new ArrayList<String>();
+ for (Enum<?> next : enumType.getEnumConstants()) {
+ String enumName = next.name().toLowerCase();
+ if (filter == null || filter.equals("") || enumName.contains(filter)) {
+ results.add(enumName);
+ }
+ }
+ return Collections.unmodifiableList(results);
+ }
+
+ protected final List<String> filter(List<String> data, String filter) {
+ return filter(data, filter, 10);
+ }
+
+ protected final List<String> filter(List<String> data, String filter, int max) {
+ List<String> results = new ArrayList<String>();
+ int count = 0;
+ for (String next : data) {
+ if (filter.equals("") //
+ || (filter.equals("null") && next == null) //
+ || (next != null && next.toLowerCase().indexOf(filter) != -1)) {
+ count++;
+ results.add(next);
+ if (count == max) {
+ break;
+ }
+ }
+ }
+ return Collections.unmodifiableList(results);
+ }
+
+ protected final String quote(String data) {
+ return "'" + data + "'";
+ }
+
+ protected final String getFormatterValueFragment(String data) {
+ boolean hasWhitespace = false;
+ for (char next : data.toCharArray()) {
+ if (Character.isWhitespace(next)) {
+ hasWhitespace = true;
+ break;
+ }
+ }
+
+ if (hasWhitespace) {
+ // interpret everything as a literal
+ return " = " + data.toLowerCase();
+ }
+
+ return null; // change all ? to _ and all * to %
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/ResourceSearchAssistant.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/ResourceSearchAssistant.java
new file mode 100644
index 0000000..94dcb7f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/ResourceSearchAssistant.java
@@ -0,0 +1,132 @@
+package org.rhq.enterprise.server.search.assist;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.search.SearchSubsystem;
+
+public class ResourceSearchAssistant extends AbstractSearchAssistant {
+
+ private static final List<String> parameterizedContexts;
+ private static final List<String> simpleContexts;
+
+ static {
+ parameterizedContexts = Collections.unmodifiableList(Arrays.asList("connection", "configuration", "trait"));
+ simpleContexts = Collections.unmodifiableList(Arrays.asList("availability", "category", "type", "plugin",
+ "name"));
+ }
+
+ @Override
+ public SearchSubsystem getSearchSubsystem() {
+ return SearchSubsystem.Resource;
+ }
+
+ @Override
+ public List<String> getSimpleContexts() {
+ return simpleContexts;
+ }
+
+ @Override
+ public List<String> getParameterizedContexts() {
+ return parameterizedContexts;
+ }
+
+ @Override
+ public List<String> getParameters(String context, String filter) {
+ if (context.equals("connection")) {
+ return execute("" //
+ + "SELECT DISTINCT definition.name " //
+ + " FROM ResourceType type " //
+ + " JOIN type.pluginConfigurationDefinition.propertyDefinitions definition " //
+ + add(" WHERE LOWER(definition.name) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY definition.name ");
+
+ } else if (context.equals("configuration")) {
+ return execute("" //
+ + "SELECT DISTINCT definition.name " //
+ + " FROM ResourceType type " //
+ + " JOIN type.resourceConfigurationDefinition.propertyDefinitions definition " //
+ + add(" WHERE LOWER(definition.name) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY definition.name ");
+
+ } else if (context.equals("trait")) {
+ return execute("" //
+ + "SELECT DISTINCT definition.name " //
+ + " FROM MeasurementDefinition definition " //
+ + " WHERE definition.dataType = 1 " //
+ + add(" AND LOWER(definition.name) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY definition.name ");
+
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ public List<String> getValues(String context, String param, String filter) {
+ if (context.equals("availability")) {
+ return filter(AvailabilityType.class, filter);
+
+ } else if (context.equals("category")) {
+ return filter(ResourceCategory.class, filter);
+
+ } else if (context.equals("type")) {
+ return execute("" //
+ + "SELECT DISTINCT type.name " //
+ + " FROM ResourceType type " //
+ + add(" WHERE LOWER(type.name) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY type.name ");
+
+ } else if (context.equals("plugin")) {
+ return execute("" //
+ + "SELECT DISTINCT type.plugin " //
+ + " FROM ResourceType type " //
+ + add(" WHERE LOWER(type.plugin) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY type.plugin ");
+
+ } else if (context.equals("name")) {
+ return execute("" //
+ + "SELECT DISTINCT res.name " //
+ + " FROM Resource res " //
+ + add(" WHERE LOWER(res.name) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY res.name ");
+
+ } else if (context.equals("connection")) {
+ return execute("" //
+ + "SELECT DISTINCT simple.stringValue " //
+ + " FROM Resource res, PropertySimple simple " //
+ + " JOIN res.pluginConfiguration.properties property " //
+ + " WHERE simple.id = property.id " //
+ + " AND property.name = '" + param + "'" //
+ + add(" AND LOWER(property.stringValue) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY simple.stringValue ");
+
+ } else if (context.equals("configuration")) {
+ return execute("" //
+ + "SELECT DISTINCT simple.stringValue " //
+ + " FROM Resource res, PropertySimple simple " //
+ + " JOIN res.resourceConfiguration.properties property " //
+ + " WHERE simple.id = property.id " //
+ + " AND property.name = '" + param + "'" //
+ + add(" AND LOWER(property.stringValue) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY simple.stringValue ");
+
+ } else if (context.equals("trait")) {
+ return execute("" //
+ + "SELECT trait.value " //
+ + " FROM MeasurementDataTrait trait " //
+ + " WHERE trait.schedule.definition.dataType = 1 " //
+ + " AND trait.schedule.definition.name = '" + param + "'" //
+ + add(" AND LOWER(trait.value) LIKE '%" + filter.toLowerCase() + "%'", filter) //
+ + "ORDER BY trait.value ");
+
+ } else {
+ return Collections.emptyList();
+
+ }
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/SearchAssistant.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/SearchAssistant.java
new file mode 100644
index 0000000..804e0bb
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/assist/SearchAssistant.java
@@ -0,0 +1,19 @@
+package org.rhq.enterprise.server.search.assist;
+
+import java.util.List;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+
+public interface SearchAssistant {
+
+ public SearchSubsystem getSearchSubsystem();
+
+ public List<String> getSimpleContexts();
+
+ public List<String> getParameterizedContexts();
+
+ public List<String> getParameters(String context, String filter);
+
+ public List<String> getValues(String context, String param, String filter);
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchAssistManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchAssistManager.java
new file mode 100644
index 0000000..e500449
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchAssistManager.java
@@ -0,0 +1,423 @@
+package org.rhq.enterprise.server.search.execution;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.enterprise.server.search.assist.ResourceSearchAssistant;
+import org.rhq.enterprise.server.search.assist.SearchAssistant;
+import org.rhq.enterprise.server.util.HibernatePerformanceMonitor;
+
+public class SearchAssistManager {
+
+ private static final Log LOG = LogFactory.getLog(SearchAssistManager.class);
+
+ private static List<String> comparisonOperators = Arrays.asList("!==", "!=", "==", "=");
+ private static List<String> booleanOperators = Arrays.asList("and", "or");
+
+ private SearchAssistant completor;
+
+ /*
+ * states:
+ *
+ * empty expression --> suggest contexts with empty filter
+ * incomplete context --> suggest contexts with passed filter, suffixed with open bracket for parameterization
+ * complete context --> suggest comparison operators with empty filter
+ * begin parameterizations --> suggest params with empty filter
+ * incomplete parameterization --> suggest params with passed filter
+ * complete parameterization --> suggest comparison operators with empty filter
+ * incomplete operator --> suggest comparison operators with passed filter
+ * complete operator --> suggest values with empty filter
+ * incomplete value --> suggest values with passed filter
+ * otherwise assume complete previous expression --> suggest boolean operators at the top
+ * --> suggest contexts with empty filter below that
+ */
+ static class SearchTermAssistant {
+
+ private static final String CARET = "@@@";
+
+ String expression;
+
+ List<String> terms;
+ int currentTermIndex;
+ int indexWithinTerm;
+
+ public SearchTermAssistant(String expression, int caretPos) {
+ // insert CARET token into expression at caretPos
+ String before = expression.substring(0, caretPos);
+ String after = expression.substring(caretPos);
+ this.expression = before + CARET + after;
+ tokenize();
+ for (int i = 0; i < terms.size(); i++) {
+ String term = terms.get(i);
+ int index = term.indexOf("@@@");
+ if (index != -1) {
+ String replaced = term.replace("@@@", "");
+ terms.set(i, replaced);
+ currentTermIndex = i;
+ indexWithinTerm = index;
+ break;
+ }
+ }
+ }
+
+ private void tokenize() {
+ List<String> fragments = tokenizeIntoFragments(expression);
+ this.terms = joinIntoTerms(fragments);
+ }
+
+ private List<String> tokenizeIntoFragments(String expression) {
+ List<String> fragments = new ArrayList<String>();
+
+ char quoteChar = 0;
+ StringBuilder term = new StringBuilder();
+ for (char nextChar : expression.toCharArray()) {
+ if (quoteChar != 0) { // accept space inside quoted strings
+ term.append(nextChar);
+ if (nextChar == quoteChar) { // look for end quote
+ quoteChar = 0; // i just left a quoted string
+ }
+ } else { // ignore spaces outside quoted string
+ if (Character.isWhitespace(nextChar)) { // spaces delimit terms outside quoted strings
+ if (term.length() > 0) {
+ fragments.add(term.toString());
+ term = new StringBuilder();
+ }
+ } else if (nextChar == '(' || nextChar == ')') {
+ // completed ignore parentheses outside quoted strings
+ } else {
+ term.append(nextChar);
+ if (nextChar == '\'' || nextChar == '"') {
+ quoteChar = nextChar; // entering a quoted string
+ }
+ }
+ }
+ }
+ if (term.length() > 0) {
+ fragments.add(term.toString());
+ }
+
+ return fragments;
+ }
+
+ private List<String> joinIntoTerms(List<String> fragments) {
+ if (fragments.size() < 3) {
+ return fragments;
+ }
+ List<String> terms = new ArrayList<String>();
+ int i = 1;
+ while (i < fragments.size() - 1) {
+ String before = fragments.get(i - 1);
+ String term = fragments.get(i);
+ if (comparisonOperators.contains(term)) {
+ String after = fragments.get(i + 1);
+ terms.add(before + term + after);
+ i += 3; // a triple of terms were processed
+ } else {
+ terms.add(before);
+ i++; // only one term processed
+ }
+ }
+
+ // if the last three terms weren't a valid triple, there will be two left over
+ if (i < fragments.size()) {
+ String nextToLast = fragments.get(fragments.size() - 2);
+ String last = fragments.get(fragments.size() - 1);
+ if (comparisonOperators.contains(last)) { // last couple was an incomplete term
+ terms.add(nextToLast + last);
+ } else {
+ terms.add(nextToLast); // there are unrelated terms, possibly simple text matches
+ terms.add(last);
+ }
+ } else if (i == fragments.size()) { // found a triple just before last fragment
+ String last = fragments.get(fragments.size() - 1);
+ terms.add(last);
+ }
+ return terms;
+ }
+
+ public List<String> getTerms() {
+ return terms;
+ }
+
+ public String getPreviousToken() {
+ return terms.get(currentTermIndex - 1);
+ }
+
+ public String getCurrentToken() {
+ return terms.get(currentTermIndex);
+ }
+
+ public String getFragmentBeforeCaret() {
+ return getCurrentToken().substring(0, indexWithinTerm);
+ }
+
+ public void report(PrintStream output) {
+ output.println("Expression: " + expression);
+ List<String> fragments = tokenizeIntoFragments(expression);
+ List<String> terms = joinIntoTerms(fragments);
+ int counter = 0;
+ for (String result : terms) {
+ output.println("Token[" + (++counter) + "]: " + result);
+ }
+ output.println();
+ }
+
+ public String toString() {
+ return null;
+ }
+ }
+
+ static class ParsedContext {
+ public enum State {
+ CONTEXT, PARAM, OPERATOR, VALUE;
+ }
+
+ public final String context;
+ public final String param;
+ public final String operator;
+ public final String value;
+ public final State state;
+
+ private ParsedContext(String context, String param, String operator, String value) {
+ this.context = context;
+ this.param = param;
+ this.operator = operator;
+ this.value = value;
+ this.state = computeState(context, param, operator, value);
+ }
+
+ private State computeState(String context, String param, String operator, String value) {
+ if (value != null) {
+ return State.VALUE;
+ }
+ if (operator != null) {
+ return State.OPERATOR;
+ }
+ if (param != null) {
+ return State.PARAM;
+ }
+ return State.CONTEXT;
+ }
+
+ public static ParsedContext get(String term) {
+ int index = 0;
+ char[] expr = term.toCharArray();
+ StringBuilder buffer = new StringBuilder();
+
+ while (index < expr.length && expr[index] != '[' && expr[index] != '!' && expr[index] != '=') { // read up until beginning of param or operator
+ buffer.append(expr[index]);
+ index++;
+ }
+ String context = buffer.toString(); // either beginning of param, beginning of operator, or end of expression
+ buffer = new StringBuilder();
+ if (index == expr.length || (expr[index] != '[' && expr[index] != '!' && expr[index] != '=')) { // if not beginning of param or operator, return
+ return new ParsedContext(context, null, null, null);
+ }
+
+ String param = null;
+ if (expr[index] == '[') { // parameterized context
+ index++; // skip over '['
+ while (index < expr.length && expr[index] != ']') { // read up until end of param
+ buffer.append(expr[index]);
+ index++;
+ }
+ param = buffer.toString();
+ buffer = new StringBuilder();
+ if (index == expr.length || expr[index] != ']') { // if not end of param, incomplete param so return
+ return new ParsedContext(context, param, null, null);
+ }
+ index++; // skip over ']'
+ }
+
+ while (index < expr.length && (expr[index] == '!' || expr[index] == '=')) { // read up until end of operator chars
+ buffer.append(expr[index]);
+ index++;
+ }
+ String operator = buffer.toString();
+ if (index == expr.length) { // return if end of expression
+ return new ParsedContext(context, param, operator, null);
+ }
+
+ String value = term.substring(index); // any remain characters are the value
+ if (value.length() > 0) {
+ if (value.charAt(0) == '\'' || value.charAt(0) == '"') {
+ value = value.substring(1);
+ }
+ }
+ return new ParsedContext(context, param, operator, value);
+ }
+
+ public String toString() {
+ StringBuilder buffer = new StringBuilder();
+ buffer.append(getClass().getSimpleName()).append("[");
+ buffer.append("state=").append(state);
+ buffer.append(", context(").append(context);
+ buffer.append("), param(").append(param);
+ buffer.append("), operator(").append(operator);
+ buffer.append("), value(").append(value).append(")]");
+ return buffer.toString();
+ }
+ }
+
+ public SearchAssistManager(SearchSubsystem searchSubsystem) {
+ this.completor = getAutoCompletor(searchSubsystem);
+ }
+
+ protected SearchAssistant getAutoCompletor(SearchSubsystem searchSubsystem) {
+ if (searchSubsystem == SearchSubsystem.Resource) {
+ return new ResourceSearchAssistant();
+ } else {
+ throw new IllegalArgumentException("No SearchAssistant found for SearchSubsystem[" + searchSubsystem + "]");
+ }
+ }
+
+ public List<String> getAllContexts() {
+ List<String> results = new ArrayList<String>(completor.getSimpleContexts());
+ for (String parameterized : completor.getParameterizedContexts()) {
+ results.add(parameterized + "[");
+ }
+ return results;
+ }
+
+ public List<SearchSuggestion> getAdvancedSuggestions(String expression, int caretPos) {
+ debug("getAdvancedSuggestions: START");
+ long id = HibernatePerformanceMonitor.get().start();
+ SearchTermAssistant assistant = new SearchTermAssistant(expression, caretPos);
+ HibernatePerformanceMonitor.get().stop(id, "SearchAssistant");
+ String[] tokens = assistant.getTerms().toArray(new String[0]);
+ debug("" + tokens.length + " tokens are " + Arrays.asList(tokens));
+
+ if (tokens.length == 0) {
+ debug("getAdvancedSuggestions: no terms");
+ return convert(getAllContexts()); // no terms yet defined
+ }
+
+ String beforeCaret = assistant.getFragmentBeforeCaret();
+ debug("getAdvancedSuggestions: beforeCaret is '" + beforeCaret + "'");
+
+ ParsedContext parsed = ParsedContext.get(beforeCaret);
+ debug("getAdvancedSuggestions: parsed is " + parsed);
+ switch (parsed.state) {
+ case CONTEXT:
+ if (parsed.context.equals("")) {
+ if (tokens.length == 1) {
+ debug("getAdvancedSuggestions: no terms yet, suggesting contexts");
+ return convert(getAllContexts());
+ } else if (isBooleanTerm(assistant.getPreviousToken())) {
+ debug("getAdvancedSuggestions: previous term was boolean, suggesting contexts");
+ return convert(getAllContexts());
+ } else {
+ debug("getAdvancedSuggestions: previous term was not boolean, suggesting boolean");
+ return convert(booleanOperators);
+ }
+ } else if (isBooleanTerm(parsed.context)) {
+ debug("getAdvancedSuggestions: beforeCaret is whole boolean operator");
+ return convert(getAllContexts()); // TODO: should we tell user to type a space first?
+ } else {
+ // check if this context is complete or not
+ if (completor.getSimpleContexts().contains(parsed.context)) {
+ debug("getAdvancedSuggestions: search term is simple context, wants operator");
+ return convert(pad(parsed.context, comparisonOperators, ""));
+ }
+ if (completor.getParameterizedContexts().contains(parsed.context)) {
+ debug("getAdvancedSuggestions: search term is parameterized context, wants open bracket");
+ return convert(Arrays.asList(parsed.context + "["));
+ }
+
+ debug("getAdvancedSuggestions: search term wants context completion");
+ List<String> startsWithContexts = new ArrayList<String>();
+ for (String context : completor.getSimpleContexts()) {
+ if (context.indexOf(parsed.context) != -1) {
+ startsWithContexts.add(context);
+ }
+ }
+ for (String context : completor.getParameterizedContexts()) {
+ if (context.indexOf(parsed.context) != -1) {
+ startsWithContexts.add(context + "[");
+ }
+ }
+ return convert(startsWithContexts);
+ }
+ case PARAM:
+ debug("getAdvancedSuggestions: param state");
+ return convert(pad(parsed.context + "[", completor.getParameters(parsed.context, parsed.param), "]"));
+ case OPERATOR:
+ debug("getAdvancedSuggestions: operator state");
+ if (comparisonOperators.contains(parsed.operator)) {
+ debug("search term is complete operator, suggesting values instead");
+ List<String> valueSuggestions = pad("\"", completor.getValues(parsed.context, parsed.param, ""), "\"");
+ if (completor.getSimpleContexts().contains(parsed.context)) {
+ debug("getAdvancedSuggestions: suggesting value completions for a simple context");
+ return convert(pad(parsed.context + parsed.operator, valueSuggestions, ""));
+ } else {
+ debug("getAdvancedSuggestions: suggesting value completions for a parameterized context");
+ return convert(pad(parsed.context + "[" + parsed.param + "]" + parsed.operator, valueSuggestions,
+ ""));
+ }
+ }
+
+ List<String> operatorSuggestions = new ArrayList<String>();
+ for (String op : comparisonOperators) {
+ if (op.startsWith(parsed.operator)) {
+ operatorSuggestions.add(op);
+ }
+ }
+
+ debug("getAdvancedSuggestions: providing suggestions for comparison operators");
+ if (completor.getSimpleContexts().contains(parsed.context)) {
+ return convert(pad(parsed.context, operatorSuggestions, ""));
+ } else {
+ return convert(pad(parsed.context + "[" + parsed.param + "]", operatorSuggestions, ""));
+ }
+ case VALUE:
+ debug("getAdvancedSuggestions: value state");
+ List<String> valueSuggestions = pad("\"", completor.getValues(parsed.context, parsed.param, parsed.value),
+ "\"");
+ if (completor.getSimpleContexts().contains(parsed.context)) {
+ debug("getAdvancedSuggestions: suggesting value completions for a simple context");
+ return convert(pad(parsed.context + parsed.operator, valueSuggestions, ""));
+ } else {
+ debug("getAdvancedSuggestions: suggesting value completions for a parameterized context");
+ return convert(pad(parsed.context + "[" + parsed.param + "]" + parsed.operator, valueSuggestions, ""));
+ }
+ default:
+ return Collections.emptyList();
+ }
+ }
+
+ private boolean isBooleanTerm(String term) {
+ for (String op : booleanOperators) {
+ if (op.equals(term)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private List<SearchSuggestion> convert(List<String> suggestions) {
+ List<SearchSuggestion> results = new ArrayList<SearchSuggestion>(suggestions.size());
+ for (String suggestion : suggestions) {
+ results.add(new SearchSuggestion(SearchSuggestion.SearchCategory.Advanced, suggestion));
+ }
+ return results;
+ }
+
+ private List<String> pad(String leftPad, List<String> data, String rightPad) {
+ List<String> results = new ArrayList<String>();
+ for (String next : data) {
+ results.add(leftPad + next + rightPad);
+ }
+ return results;
+ }
+
+ private void debug(String message) {
+ LOG.info(message);
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchSuggestion.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchSuggestion.java
new file mode 100644
index 0000000..e69090d
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchSuggestion.java
@@ -0,0 +1,52 @@
+package org.rhq.enterprise.server.search.execution;
+
+public class SearchSuggestion {
+ public enum SearchCategory {
+ Simple, Advanced, SavedSearch, InstructionalTextComment, Unknown;
+ }
+
+ private final SearchCategory category;
+ private final String value;
+ private final String label;
+ private final int startIndex;
+ private final int endIndex;
+
+ public SearchSuggestion(SearchCategory category, String value) {
+ this(category, value, 0, 0);
+ }
+
+ public SearchSuggestion(SearchCategory category, String value, int startIndex, int length) {
+ this.category = category;
+ this.label = value;
+ this.value = value;
+ this.startIndex = startIndex;
+ this.endIndex = startIndex + length;
+ }
+
+ public SearchCategory getCategory() {
+ return category;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public int getStartIndex() {
+ return startIndex;
+ }
+
+ public int getEndIndex() {
+ return endIndex;
+ }
+
+ public String toString() {
+ String before = label.substring(0, startIndex);
+ String highlight = label.substring(startIndex, endIndex);
+ String after = label.substring(endIndex);
+ return before + "(" + highlight + ")" + after + "->" + value;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchTranslationManager.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchTranslationManager.java
new file mode 100644
index 0000000..cf5f4bf
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/execution/SearchTranslationManager.java
@@ -0,0 +1,268 @@
+package org.rhq.enterprise.server.search.execution;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.tree.CommonTree;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.enterprise.server.search.RHQLLexer;
+import org.rhq.enterprise.server.search.RHQLParser;
+import org.rhq.enterprise.server.search.antlr.RHQLNodeAdaptor;
+import org.rhq.enterprise.server.search.translation.SearchTranslator;
+import org.rhq.enterprise.server.search.translation.SearchTranslatorFactory;
+import org.rhq.enterprise.server.search.translation.antlr.RHQLComparisonOperator;
+import org.rhq.enterprise.server.search.translation.antlr.RHQLTerm;
+import org.rhq.enterprise.server.search.translation.antlr.RHQLTreeOperator;
+import org.rhq.enterprise.server.search.translation.jpql.SearchFragment;
+import org.rhq.enterprise.server.search.translation.jpql.SearchFragmentType;
+
+public class SearchTranslationManager {
+
+ private SearchSubsystem context;
+ private String expression;
+ private SearchTranslator translator;
+
+ private RHQLLexer lexer;
+ private RHQLParser parser;
+ private RHQLNodeAdaptor adaptor;
+
+ private String entity;
+ private String alias;
+
+ public SearchTranslationManager(SearchSubsystem context) {
+ this.context = context;
+ this.entity = this.context.getEntityClass().getSimpleName();
+ this.alias = this.entity.substring(0, 1).toLowerCase();
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+
+ this.translator = SearchTranslatorFactory.getTranslator(this.context);
+
+ ANTLRStringStream input = new ANTLRStringStream(expression); // Create an input character stream from standard in
+ this.lexer = new RHQLLexer(input); // Create an echoLexer that feeds from that stream
+
+ CommonTokenStream tokens = new CommonTokenStream(lexer); // Create a stream of tokens fed by the lexer
+ this.parser = new RHQLParser(tokens); // Create a parser that feeds off the token stream
+
+ this.adaptor = new RHQLNodeAdaptor();
+ parser.setTreeAdaptor(adaptor);
+ }
+
+ public String getJPQLSelectStatement() throws Exception {
+ String jpql = "SELECT " + alias + " FROM " + entity + " " + alias + " WHERE " + getJPQLWhereFragment();
+ System.out.println("JPQL was:");
+ PrintUtils.printJPQL(jpql.split(" "));
+ System.out.println();
+ return jpql;
+ }
+
+ public String getJPQLWhereFragment() throws Exception {
+ RHQLParser.searchExpression_return searchAST = parser.searchExpression();
+
+ System.out.println("Search was: " + expression);
+ CommonTree searchExpressionTree = (CommonTree) searchAST.getTree();
+ System.out.println("Errors found: " + adaptor.getErrorMessages());
+ System.out.println("Tree was:");
+ PrintUtils.print(searchExpressionTree, "");
+ String fragment = generateJPQL(searchExpressionTree);
+ return fragment;
+ }
+
+ private String generateJPQL(CommonTree tree) {
+ StringBuilder builder = new StringBuilder();
+ builder.append(" ( ");
+
+ Token token = tree.getToken();
+ if (token == null) {
+ return null;
+ }
+
+ RHQLTreeOperator operator = getTreeOperatorFromTokenType(token.getType());
+ if (operator != null) {
+ for (int childIndex = 0; childIndex < tree.getChildCount(); childIndex++) {
+ CommonTree child = (CommonTree) tree.getChild(childIndex);
+ if (childIndex != 0) {
+ builder.append(" " + operator.name() + " ");
+ }
+ builder.append(generateJPQL(child));
+ }
+ } else {
+ List<RHQLTerm> terms = getFromAST(tree);
+ boolean first = true;
+ for (RHQLTerm nextTerm : terms) {
+ if (first == false) {
+ builder.append(" AND "); // implicit AND for IN-clause values
+ } else {
+ first = false;
+ }
+
+ SearchFragment searchFragment = translator.getSearchFragment(alias, nextTerm);
+ String jpqlFragment = searchFragment.getFragment();
+ if (searchFragment.getType() == SearchFragmentType.PRIMARY_KEY_SUBQUERY) {
+ jpqlFragment = " " + alias + ".id IN (" + jpqlFragment + ")";
+ }
+
+ builder.append(jpqlFragment);
+ }
+ }
+
+ builder.append(" ) ");
+ return builder.toString();
+ }
+
+ public static List<RHQLTerm> getFromAST(CommonTree tree) {
+ List<RHQLTerm> terms = new ArrayList<RHQLTerm>();
+
+ CommonTree contextTree = (CommonTree) tree.getChild(0);
+
+ String lineage = null;
+ String path = null;
+ String param = null;
+ for (int childIndex = 0; childIndex < contextTree.getChildCount(); childIndex++) {
+ CommonTree child = (CommonTree) contextTree.getChild(childIndex);
+ if (child.getToken().getType() == RHQLLexer.LINEAGE) {
+ lineage = PrintUtils.collapseStringChildren(child);
+ } else if (child.getToken().getType() == RHQLLexer.PATH) {
+ path = PrintUtils.collapseStringChildren(child);
+ } else if (child.getToken().getType() == RHQLLexer.PARAM) {
+ child = (CommonTree) child.getChild(0); // get the IDENT child of PARAM
+ param = PrintUtils.collapseStringChildren(child);
+ }
+ }
+
+ String value = null;
+ if (tree.getChildCount() > 1) {
+ CommonTree valueTree = (CommonTree) tree.getChild(1);
+ for (int childIndex = 0; childIndex < valueTree.getChildCount(); childIndex++) {
+ CommonTree indentChildTree = (CommonTree) valueTree.getChild(childIndex);
+ value = PrintUtils.collapseStringChildren(indentChildTree);
+
+ int type = tree.getToken().getType();
+ RHQLComparisonOperator operator = getComparisonOperatorFromTokenType(type, value);
+
+ RHQLTerm nextTerm = new RHQLTerm(lineage, path, param, operator, value);
+ terms.add(nextTerm);
+ }
+ }
+
+ return terms;
+ }
+
+ public static RHQLComparisonOperator getComparisonOperatorFromTokenType(int tokenType, String value) {
+ boolean nullValue = value.trim().toLowerCase().equals("null");
+
+ switch (tokenType) {
+ case RHQLLexer.OP_EQUALS:
+ return nullValue ? RHQLComparisonOperator.NULL : RHQLComparisonOperator.EQUALS;
+ case RHQLLexer.OP_EQUALS_STRICT:
+ return nullValue ? RHQLComparisonOperator.NULL : RHQLComparisonOperator.EQUALS_STRICT;
+ case RHQLLexer.OP_NOT_EQUALS:
+ return nullValue ? RHQLComparisonOperator.NOT_NULL : RHQLComparisonOperator.NOT_EQUALS;
+ case RHQLLexer.OP_NOT_EQUALS_STRICT:
+ return nullValue ? RHQLComparisonOperator.NOT_NULL : RHQLComparisonOperator.NOT_EQUALS_STRICT;
+ default:
+ throw new IllegalArgumentException("There is no known RHQLComparisonOperator for token type " + tokenType);
+ }
+ }
+
+ public static RHQLTreeOperator getTreeOperatorFromTokenType(int tokenType) {
+ switch (tokenType) {
+ case RHQLLexer.AND:
+ return RHQLTreeOperator.AND;
+ case RHQLLexer.OR:
+ return RHQLTreeOperator.OR;
+ default:
+ return null;
+ }
+ }
+
+ private static class PrintUtils {
+ public static void printJPQL(String[] tokens) {
+ String indent = "";
+ List<String> lineBreakers = Arrays.asList("SELECT", "FROM", "WHERE", "AND", "OR", "(", ")");
+ for (String next : tokens) {
+ if (next.equals("(")) {
+ indent = " " + indent;
+ }
+
+ if (lineBreakers.contains(next)) {
+ System.out.println();
+ System.out.print(indent);
+ }
+
+ System.out.print(next);
+ System.out.print(" ");
+
+ if (next.equals(")")) {
+ indent = indent.substring(3);
+ }
+ }
+ }
+
+ public static void print(CommonTree tree, String indent) {
+ if (tree == null) {
+ return;
+ }
+ /*
+ if (tree instanceof CommonErrorNode) {
+ CommonErrorNode errorNode = (CommonErrorNode) tree;
+ RecognitionException error = errorNode.trappedException;
+ int position = error.index;
+ if (error instanceof MismatchedTokenException) {
+ MismatchedTokenException mismatchedError = (MismatchedTokenException) error;
+ int expecting = mismatchedError.expecting;
+ String expectedToken = parser.getTokenNames()[expecting];
+ }
+ }
+ */
+
+ Token token = tree.getToken();
+ if (token == null) {
+ return;
+ }
+
+ System.out.print(indent + token.getText());
+ if (isStringNode(token)) {
+ System.out.println(collapseStringChildren(tree));
+ } else {
+ System.out.println();
+ for (int childIndex = 0; childIndex < tree.getChildCount(); childIndex++) {
+ CommonTree child = (CommonTree) tree.getChild(childIndex);
+ print(child, indent + " ");
+ }
+ }
+ }
+
+ private static boolean isStringNode(Token token) {
+ switch (token.getType()) {
+ case RHQLLexer.PATH:
+ case RHQLLexer.IDENT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static String collapseStringChildren(CommonTree tree) {
+ StringBuilder builder = new StringBuilder();
+ for (int childIndex = 0; childIndex < tree.getChildCount(); childIndex++) {
+ CommonTree child = (CommonTree) tree.getChild(childIndex);
+ builder.append(child.getText());
+ }
+ return builder.toString();
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ SearchTranslationManager manager = new SearchTranslationManager(SearchSubsystem.Resource);
+ manager.setExpression("(name = rhq and category = server) or plugin = jbossas");
+ String jpql = manager.getJPQLSelectStatement();
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/AbstractSearchTranslator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/AbstractSearchTranslator.java
new file mode 100644
index 0000000..ea4b22a
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/AbstractSearchTranslator.java
@@ -0,0 +1,78 @@
+package org.rhq.enterprise.server.search.translation;
+
+import org.rhq.enterprise.server.search.translation.antlr.RHQLComparisonOperator;
+
+public abstract class AbstractSearchTranslator implements SearchTranslator {
+
+ protected String getJPQLForString(String fragment, RHQLComparisonOperator operator, String value) {
+ if (operator == RHQLComparisonOperator.EQUALS) {
+ return lower(fragment) + " LIKE '%" + value.toLowerCase() + "%'";
+
+ } else if (operator == RHQLComparisonOperator.EQUALS_STRICT) {
+ return fragment + " LIKE '%" + value + "%'";
+
+ } else if (operator == RHQLComparisonOperator.NOT_EQUALS) {
+ return lower(fragment) + " LIKE '%" + value.toLowerCase() + "%'";
+
+ } else if (operator == RHQLComparisonOperator.NOT_EQUALS_STRICT) {
+ return fragment + " LIKE '%" + value + "%'";
+
+ } else if (operator == RHQLComparisonOperator.NULL) {
+ return fragment + " IS NULL";
+
+ } else if (operator == RHQLComparisonOperator.NOT_NULL) {
+ return fragment + " IS NOT NULL";
+
+ } else {
+ throw new IllegalArgumentException("Unsupported operator " + operator);
+ }
+ }
+
+ protected String getJPQLForEnum(String fragment, RHQLComparisonOperator operator, String value,
+ Class<? extends Enum<?>> enumClass, boolean useOrdinal) {
+ if (operator == RHQLComparisonOperator.EQUALS) {
+ return fragment + " = " + getEnum(enumClass, value, useOrdinal);
+
+ } else if (operator == RHQLComparisonOperator.EQUALS_STRICT) {
+ return fragment + " = " + getEnum(enumClass, value, useOrdinal);
+
+ } else if (operator == RHQLComparisonOperator.NOT_EQUALS) {
+ return fragment + " != " + getEnum(enumClass, value, useOrdinal);
+
+ } else if (operator == RHQLComparisonOperator.NOT_EQUALS_STRICT) {
+ return fragment + " != " + getEnum(enumClass, value, useOrdinal);
+
+ } else if (operator == RHQLComparisonOperator.NULL) {
+ return fragment + " IS NULL";
+
+ } else if (operator == RHQLComparisonOperator.NOT_NULL) {
+ return fragment + " IS NOT NULL";
+
+ } else {
+ throw new IllegalArgumentException("Unsupported operator " + operator);
+ }
+ }
+
+ protected String getEnum(Class<? extends Enum<?>> enumClass, String value, boolean useOrdinal) {
+ for (Enum<?> nextEnum : enumClass.getEnumConstants()) {
+ if (nextEnum.name().toLowerCase().equals(value.toLowerCase())) {
+ if (useOrdinal) {
+ return String.valueOf(nextEnum.ordinal());
+ } else {
+ return nextEnum.name();
+ }
+ }
+ }
+ throw new IllegalArgumentException("No enum of type '" + enumClass.getSimpleName() + "' with name matching '"
+ + value + "'");
+ }
+
+ protected String lower(String data) {
+ return "LOWER(" + data + ")";
+ }
+
+ protected String quote(String data) {
+ return "'" + data + "'";
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/ResourceSearchTranslator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/ResourceSearchTranslator.java
new file mode 100644
index 0000000..1b1565c
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/ResourceSearchTranslator.java
@@ -0,0 +1,76 @@
+package org.rhq.enterprise.server.search.translation;
+
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.enterprise.server.search.translation.antlr.RHQLComparisonOperator;
+import org.rhq.enterprise.server.search.translation.antlr.RHQLTerm;
+import org.rhq.enterprise.server.search.translation.jpql.SearchFragment;
+import org.rhq.enterprise.server.search.translation.jpql.SearchFragmentType;
+
+public class ResourceSearchTranslator extends AbstractSearchTranslator {
+
+ public SearchFragment getSearchFragment(String alias, RHQLTerm term) {
+ String path = term.getPath();
+ RHQLComparisonOperator op = term.getOperator();
+ String param = term.getParam();
+
+ String filter = term.getValue();
+
+ if (path.equals("availability")) {
+ return new SearchFragment(SearchFragmentType.WHERE_CLAUSE, //
+ getJPQLForEnum(alias + ".currentAvailability.availabilityType", op, filter, AvailabilityType.class,
+ true));
+
+ } else if (path.equals("category")) {
+ return new SearchFragment(SearchFragmentType.WHERE_CLAUSE, //
+ getJPQLForString(alias + ".resourceType.category", op, filter));
+
+ } else if (path.equals("type")) {
+ return new SearchFragment(SearchFragmentType.WHERE_CLAUSE, //
+ getJPQLForString(alias + ".resourceType.name", op, filter));
+
+ } else if (path.equals("plugin")) {
+ return new SearchFragment(SearchFragmentType.WHERE_CLAUSE, //
+ getJPQLForString(alias + ".resourceType.plugin", op, filter));
+
+ } else if (path.equals("name")) {
+ return new SearchFragment(SearchFragmentType.WHERE_CLAUSE, //
+ getJPQLForString(alias + ".name", op, filter));
+
+ } else if (path.equals("trait")) {
+ return new SearchFragment( //
+ SearchFragmentType.PRIMARY_KEY_SUBQUERY, "SELECT res.id" //
+ + " FROM Resource res, MeasurementDataTrait trait " //
+ + " JOIN res.schedules schedule " //
+ + " WHERE trait.schedule = schedule " //
+ + " AND schedule.definition.dataType = 1 " //
+ + " AND schedule.definition.name = " + quote(param) //
+ + " AND " + getJPQLForString("trait.value", op, filter));
+
+ } else if (path.equals("connection")) {
+ return new SearchFragment( //
+ SearchFragmentType.PRIMARY_KEY_SUBQUERY, "SELECT res.id" //
+ + " FROM Resource res " //
+ + " JOIN res.resourceType.pluginConfigurationDefinition.propertyDefinitions definition " //
+ + " JOIN res.pluginConfiguration.properties property " //
+ + " WHERE definition.name = " + quote(param) //
+ + " AND " + getJPQLForString("property.value", op, filter));
+
+ } else if (path.equals("configuration")) {
+ return new SearchFragment( //
+ SearchFragmentType.PRIMARY_KEY_SUBQUERY, "SELECT res.id" //
+ + " FROM Resource res " //
+ + " JOIN res.resourceType.resourceConfigurationDefinition.propertyDefinitions definition " //
+ + " JOIN res.resourceConfiguration.properties property " //
+ + " WHERE definition.name = " + quote(param) //
+ + " AND " + getJPQLForString("property.value", op, filter));
+
+ } else {
+ if (param == null) {
+ throw new IllegalArgumentException("No search fragment available for " + path);
+ } else {
+ throw new IllegalArgumentException("No search fragment available for " + path + "[" + param + "]");
+ }
+ }
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslator.java
new file mode 100644
index 0000000..eca293f
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslator.java
@@ -0,0 +1,9 @@
+package org.rhq.enterprise.server.search.translation;
+
+import org.rhq.enterprise.server.search.translation.antlr.RHQLTerm;
+import org.rhq.enterprise.server.search.translation.jpql.SearchFragment;
+
+public interface SearchTranslator {
+
+ public SearchFragment getSearchFragment(String alias, RHQLTerm term);
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslatorFactory.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslatorFactory.java
new file mode 100644
index 0000000..fa8d626
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/SearchTranslatorFactory.java
@@ -0,0 +1,16 @@
+package org.rhq.enterprise.server.search.translation;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+
+public class SearchTranslatorFactory {
+ private SearchTranslatorFactory() {
+ // force use of static methods only
+ }
+
+ public static SearchTranslator getTranslator(SearchSubsystem searchContext) {
+ if (searchContext == SearchSubsystem.Resource) {
+ return new ResourceSearchTranslator();
+ }
+ throw new IllegalArgumentException("No SearchTranslator found for SearchContext[" + searchContext + "]");
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLComparisonOperator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLComparisonOperator.java
new file mode 100644
index 0000000..12ce22e
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLComparisonOperator.java
@@ -0,0 +1,10 @@
+package org.rhq.enterprise.server.search.translation.antlr;
+
+public enum RHQLComparisonOperator {
+ EQUALS, //
+ EQUALS_STRICT, //
+ NOT_EQUALS, //
+ NOT_EQUALS_STRICT, //
+ NULL, //
+ NOT_NULL;
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTerm.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTerm.java
new file mode 100644
index 0000000..687607d
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTerm.java
@@ -0,0 +1,39 @@
+package org.rhq.enterprise.server.search.translation.antlr;
+
+public class RHQLTerm {
+ private final String lineage;
+ private final String path;
+ private final String param;
+
+ private final RHQLComparisonOperator operator;
+
+ private final String value;
+
+ public RHQLTerm(String lineage, String path, String param, RHQLComparisonOperator operator, String value) {
+ this.lineage = lineage;
+ this.path = path;
+ this.param = param;
+ this.operator = operator;
+ this.value = value;
+ }
+
+ public String getLineage() {
+ return lineage;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getParam() {
+ return param;
+ }
+
+ public RHQLComparisonOperator getOperator() {
+ return operator;
+ }
+
+ public String getValue() {
+ return value;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTreeOperator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTreeOperator.java
new file mode 100644
index 0000000..a1e9a6c
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/antlr/RHQLTreeOperator.java
@@ -0,0 +1,6 @@
+package org.rhq.enterprise.server.search.translation.antlr;
+
+public enum RHQLTreeOperator {
+ AND, //
+ OR;
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragment.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragment.java
new file mode 100644
index 0000000..4aadde7
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragment.java
@@ -0,0 +1,20 @@
+package org.rhq.enterprise.server.search.translation.jpql;
+
+public class SearchFragment {
+
+ private final SearchFragmentType type;
+ private final String fragment;
+
+ public SearchFragment(SearchFragmentType type, String fragment) {
+ this.type = type;
+ this.fragment = fragment;
+ }
+
+ public SearchFragmentType getType() {
+ return type;
+ }
+
+ public String getFragment() {
+ return fragment;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragmentType.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragmentType.java
new file mode 100644
index 0000000..bbde0d4
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/search/translation/jpql/SearchFragmentType.java
@@ -0,0 +1,5 @@
+package org.rhq.enterprise.server.search.translation.jpql;
+
+public enum SearchFragmentType {
+ WHERE_CLAUSE, PRIMARY_KEY_SUBQUERY;
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index bb0c072..5ffcae8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -42,10 +42,13 @@ import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.util.PersistenceUtility;
+import org.rhq.core.util.exception.ThrowableUtil;
+import org.rhq.enterprise.server.search.execution.SearchTranslationManager;
/**
* A query generator used to generate queries with specific filtering, prefetching, or sorting requirements.
@@ -62,6 +65,7 @@ public final class CriteriaQueryGenerator {
}
private Criteria criteria;
+ private String searchExpressionWhereClause;
private String authorizationJoinFragment;
private String authorizationPermsFragment;
@@ -77,6 +81,7 @@ public final class CriteriaQueryGenerator {
public CriteriaQueryGenerator(Criteria criteria) {
this.criteria = criteria;
+ initializeJPQLFragmentFromSearchExpression();
String criteriaClassName = criteria.getClass().getSimpleName();
className = criteriaClassName.substring(0, criteriaClassName.length() - 8);
@@ -275,6 +280,16 @@ public final class CriteriaQueryGenerator {
results.append(this.authorizationCustomConditionFragment);
}
+ if (searchExpressionWhereClause != null) {
+ if (firstCrit) {
+ firstCrit = false;
+ } else {
+ // always want to additionally filter by translated from the RHQL search expression
+ results.append(NL).append(" AND ");
+ }
+ results.append(searchExpressionWhereClause);
+ }
+
if (countQuery == false) {
boolean overridden = true;
PageControl pc = criteria.getPageControlOverrides();
@@ -313,6 +328,30 @@ public final class CriteriaQueryGenerator {
return results.toString();
}
+ private void initializeJPQLFragmentFromSearchExpression() {
+ String searchExpression = criteria.getSearchExpression();
+ if (searchExpression == null) {
+ return;
+ }
+
+ try {
+ Class<?> entityClass = criteria.getPersistentClass();
+ SearchTranslationManager searchManager = new SearchTranslationManager(SearchSubsystem.get(entityClass));
+ searchManager.setExpression(searchExpression);
+
+ // translate first, if there was an error we won't add the dangling 'AND' to the where clause
+ String translatedJPQL = searchManager.getJPQLWhereFragment();
+ LOG.info("Translated JPQL Fragment was: " + translatedJPQL);
+ if (translatedJPQL != null) {
+ searchExpressionWhereClause = translatedJPQL;
+ }
+ } catch (Exception e) {
+ LOG.error("Could not get JPQL translation for '" + searchExpression + "': "
+ + ThrowableUtil.getAllMessages(e, true));
+ }
+
+ }
+
private boolean isPersistentBag(String fieldName) {
try {
Class<?> persistentClass = criteria.getPersistentClass();
diff --git a/modules/enterprise/server/jar/src/main/resources/single-line-rhql.txt b/modules/enterprise/server/jar/src/main/resources/single-line-rhql.txt
index f8c241a..8793fb1 100644
--- a/modules/enterprise/server/jar/src/main/resources/single-line-rhql.txt
+++ b/modules/enterprise/server/jar/src/main/resources/single-line-rhql.txt
@@ -4,42 +4,24 @@ context = value
context == value
context != value
context !== value
-context is null
-context is not null
-context in [value]
-context in [value1, value2]
-context in [value1, value2, value3]
-context not in [value]
-context not in [value1, value2]
-context not in [value1, value2, value3]
+context = null
+context != null
# simple term, all operators, quoted value
context = 'quoted value'
context == 'quoted value'
context != 'quoted value'
context !== 'quoted value'
-context is null
-context is not null
-context in ['quoted value1']
-context in ['quoted value1', 'quoted value2']
-context in ['quoted value1', 'quoted value2', 'quoted value3']
-context not in ['quoted value1']
-context not in ['quoted value1', 'quoted value2']
-context not in ['quoted value1', 'quoted value2', 'quoted value3']
+context = null
+context != null
# parameterized term, all operators
context[param] = value
context[param] == value
context[param] != value
context[param] !== value
-context[param] is null
-context[param] is not null
-context[param] in [value]
-context[param] in [value1, value2]
-context[param] in [value1, value2, value3]
-context[param] not in [value]
-context[param] not in [value1, value2]
-context[param] not in [value1, value2, value3]
+context[param] = null
+context[param] != null
# deeply nested parenthetical simple terms
((context = value))
@@ -52,28 +34,16 @@ context[param] not in [value1, value2, value3]
(context == value)
(context != value)
(context !== value)
-(context is null)
-(context is not null)
-(context in [value])
-(context in [value1, value2])
-(context in [value1, value2, value3])
-(context not in [value])
-(context not in [value1, value2])
-(context not in [value1, value2, value3])
+(context = null)
+(context != null)
# parameterized parenthetical term, all operators
(context[param] = value)
(context[param] == value)
(context[param] != value)
(context[param] !== value)
-(context[param] is null)
-(context[param] is not null)
-(context[param] in [value])
-(context[param] in [value1, value2])
-(context[param] in [value1, value2, value3])
-(context[param] not in [value])
-(context[param] not in [value1, value2])
-(context[param] not in [value1, value2, value3])
+(context[param] = null)
+(context[param] != null)
# single-pair parenthetical combinations
@@ -84,11 +54,12 @@ context = value1 or (context = value2)
(context = value1) or (context = value2)
# single-pair parenthetical combinations
-# simple expression, 'and' boolean operator
-context = value and context = value
-(context = value) and context = value
-context = value and (context = value)
-(context = value) and (context = value)
+# simple expression, '|' boolean operator (meaning 'or')
+context = value1 | context = value2
+(context = value1) | context = value2
+context = value1 | (context = value2)
+(context = value1) | (context = value2)
+
# single-pair parenthetical combinations
# simple expression, no boolean operator (implies 'and' semantics)
@@ -108,13 +79,13 @@ context = value (context = value)
context = value1 or ((context = value2))
# double-pair parenthetical combinations
-# simple expression, 'and' boolean operator
-((context = value1 and context = value2))
-((context = value1) and context = value2)
-((context = value1)) and context = value2
-(context = value1) and (context = value2)
-(context = value1 and (context = value2))
-context = value1 and ((context = value2))
+# simple expression, '|' boolean operator (meaning 'or')
+((context = value1 | context = value2))
+((context = value1) | context = value2)
+((context = value1)) | context = value2
+(context = value1) | (context = value2)
+(context = value1 | (context = value2))
+context = value1 | ((context = value2))
# double-pair parenthetical combinations
# simple expression, no boolean operator (implies 'and' semantics)
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
new file mode 100644
index 0000000..867ee78
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/GenericSearchAssistTest.java
@@ -0,0 +1,91 @@
+package org.rhq.enterprise.server.search;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import org.rhq.enterprise.server.search.execution.SearchSuggestion;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+
+public class GenericSearchAssistTest extends AbstractEJB3Test {
+
+ @Test
+ public void testGenericAssist() throws Exception {
+ BufferedReader reader = null;
+ try {
+ InputStream stream = getClass().getClassLoader().getResourceAsStream("test-assist-color-number.txt");
+ reader = new BufferedReader(new InputStreamReader(stream));
+ String expression = null;
+ String expected = null;
+
+ int count = 0;
+ while (true) {
+ expression = reader.readLine();
+ if (expression == null) {
+ break;
+ }
+ expected = reader.readLine();
+ if (expected == null) {
+ break;
+ }
+
+ count++;
+ List<SearchSuggestion> results = new TestAutoCompletionManager().getAdvancedSuggestions(expression,
+ expression.length());
+ List<String> expectedResults = Arrays.asList(expected.split(" "));
+
+ System.out.println();
+ System.out.println("Expression: " + expression);
+ try {
+ compare(results, expectedResults);
+ System.out.println("Assist worked: " + parenthesize(expectedResults.toString()));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ System.out.println("Tested " + count + " expressions for assist");
+ } catch (Exception e) {
+ System.out.println("Error testing single line RHQL: " + e);
+ throw e;
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ }
+
+ private void compare(List<SearchSuggestion> results, List<String> expected) {
+ List<String> rawResults = new ArrayList<String>();
+ for (SearchSuggestion suggestion : results) {
+ rawResults.add(suggestion.getValue());
+ }
+
+ Collections.sort(rawResults);
+ Collections.sort(expected);
+
+ assert rawResults.size() == expected.size() : print(expected, rawResults);
+ for (int i = 0; i < rawResults.size(); i++) {
+ String nextRaw = rawResults.get(i);
+ String nextExpected = expected.get(i);
+ assert nextRaw.equals(nextExpected) : print(expected, rawResults);
+ }
+ }
+
+ private String print(List<String> expected, List<String> results) {
+ return "expected" + parenthesize(expected.toString()) + ", results" + parenthesize(results.toString());
+ }
+
+ private String parenthesize(String data) {
+ return "(" + data.substring(1, data.length() - 1) + ")";
+ }
+
+ public static void main(String[] args) throws Exception {
+ new GenericSearchAssistTest().testGenericAssist();
+ }
+}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/TestAutoCompletionManager.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/TestAutoCompletionManager.java
new file mode 100644
index 0000000..89cb5ff
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/TestAutoCompletionManager.java
@@ -0,0 +1,71 @@
+package org.rhq.enterprise.server.search;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.rhq.core.domain.search.SearchSubsystem;
+import org.rhq.enterprise.server.search.assist.AbstractSearchAssistant;
+import org.rhq.enterprise.server.search.assist.SearchAssistant;
+import org.rhq.enterprise.server.search.execution.SearchAssistManager;
+
+public class TestAutoCompletionManager extends SearchAssistManager {
+ public static class TestAutoCompletor extends AbstractSearchAssistant {
+ /*
+ * color[primary] = red, green, blue
+ * color[other] = red-green, green-blue, blue-red
+ * number = two, four, twenty-two, twenty-four, forty-two
+ */
+
+ private static Map<String, List<String>> suggestionMap = new HashMap<String, List<String>>();
+
+ static {
+ suggestionMap.put("color:params", build("primary", "other"));
+ suggestionMap.put("color:primary", build("red", "green", "blue"));
+ suggestionMap.put("color:other", build("red-green", "green-blue", "blue-red"));
+ suggestionMap.put("number:", build("two", "four", "twenty-two", "twenty-four", "forty-two"));
+ }
+
+ private static List<String> build(String... items) {
+ return Collections.unmodifiableList(Arrays.asList(items));
+ }
+
+ @Override
+ public SearchSubsystem getSearchSubsystem() {
+ return null;
+ }
+
+ @Override
+ public List<String> getSimpleContexts() {
+ return Arrays.asList("number");
+ }
+
+ @Override
+ public List<String> getParameterizedContexts() {
+ return Arrays.asList("color");
+ }
+
+ @Override
+ public List<String> getParameters(String context, String filter) {
+ super.getParameters(context, filter);
+ return filter(suggestionMap.get("color:params"), filter);
+ }
+
+ @Override
+ public List<String> getValues(String context, String param, String filter) {
+ super.getValues(context, param, filter);
+ String lookup = context + ":" + (param == null ? "" : param);
+ return filter(suggestionMap.get(lookup), filter);
+ }
+ }
+
+ public TestAutoCompletionManager() {
+ super(null);
+ }
+
+ protected SearchAssistant getAutoCompletor(SearchSubsystem searchContext) {
+ return new TestAutoCompletor();
+ }
+}
diff --git a/modules/enterprise/server/jar/src/test/resources/test-assist-color-number.txt b/modules/enterprise/server/jar/src/test/resources/test-assist-color-number.txt
new file mode 100644
index 0000000..6ad90cc
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/resources/test-assist-color-number.txt
@@ -0,0 +1,46 @@
+
+color[ number
+c
+color[
+n
+number
+r
+color[ number
+lo
+color[
+number
+number!= number!== number= number==
+be
+number
+number==
+number=="two" number=="four" number=="twenty-two" number=="twenty-four" number=="forty-two"
+number==t
+number=="two" number=="twenty-two" number=="twenty-four" number=="forty-two"
+number==fo
+number=="four" number=="twenty-four" number=="forty-two"
+color
+color[
+color[
+color[primary] color[other]
+color[p
+color[primary]
+color[o
+color[other]
+color[r
+color[primary] color[other]
+color[primary
+color[primary]
+color[primary]
+color[primary]!= color[primary]!== color[primary]= color[primary]==
+color[primary]=
+color[primary]="red" color[primary]="green" color[primary]="blue"
+color[primary]=e
+color[primary]="red" color[primary]="green" color[primary]="blue"
+color[primary]=d
+color[primary]="red"
+color[primary]=g
+color[primary]="green"
+color[primary]=b
+color[primary]="blue"
+color[primary]=r
+color[primary]="red" color[primary]="green"
\ No newline at end of file
commit c2723d3207e94df7deca88c07203016e63a9de54
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Mar 9 13:37:38 2010 -0500
BZ-571590: enhance dynagroup expression builder to support resource categories
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java
index 0f1b9ea..0ac6aa4 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/definition/group/GroupDefinitionExpressionBuilderLibraryUIBean.java
@@ -40,7 +40,10 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class GroupDefinitionExpressionBuilderLibraryUIBean {
private enum PropertyType {
- RESOURCE("Resource"), RESOURCE_TYPE("Resource Type"), TRAIT("Traits"), // resource.trait[<property_name>]
+ RESOURCE("Resource"), //
+ RESOURCE_TYPE("Resource Type"), //
+ RESOURCE_CATEGORY("Resource Category"), //
+ TRAIT("Traits"), // resource.trait[<property_name>]
PLUGIN_CONFIGURATION("Plugin Configuration"), // resource.pluginConfiguration[<property_name>]
RESOURCE_CONFIGURATION("Resource Configuration"); // resource.resourceConfiguration[<property_name>]
@@ -312,7 +315,8 @@ public class GroupDefinitionExpressionBuilderLibraryUIBean {
public boolean isTypeSelectionDisabled() {
this.typeSelectionDisabled = PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE
- || (isGroupby() && PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE_TYPE);
+ || (isGroupby() && PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE_TYPE)
+ || PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE_CATEGORY;
return typeSelectionDisabled;
}
@@ -349,7 +353,8 @@ public class GroupDefinitionExpressionBuilderLibraryUIBean {
processPluginChange(requestParamPlugin);
}
- this.typeSelectionDisabled = PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE;
+ this.typeSelectionDisabled = PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE
+ || PropertyType.getFromDisplayName(this.selectedPropertyType) == PropertyType.RESOURCE_CATEGORY;
/*
* the other process methods have already reset / updated the other drop-downs as necessary,
@@ -493,6 +498,9 @@ public class GroupDefinitionExpressionBuilderLibraryUIBean {
case RESOURCE_TYPE:
buf.append("type.plugin");
break;
+ case RESOURCE_CATEGORY:
+ buf.append("type.category");
+ break;
case TRAIT:
buf.append("trait[" + this.selectedProperty + "]");
break;
@@ -524,6 +532,7 @@ public class GroupDefinitionExpressionBuilderLibraryUIBean {
switch (PropertyType.getFromDisplayName(this.selectedPropertyType)) {
case RESOURCE:
+ case RESOURCE_CATEGORY:
buf.append(this.enteredValue);
break;
case RESOURCE_TYPE:
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/definition/group/library.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/definition/group/library.xhtml
index 631b67e..ee6c15f 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/definition/group/library.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/definition/group/library.xhtml
@@ -61,6 +61,7 @@
The type of property this expression switches on:<br/>
<b>Resource:</b> A resource property such as its name or version<br/>
<b>Resource Type:</b> Search for resources of a specific type<br/>
+ <b>Resource Category:</b> search for resources by category: platform, server, service<br/>
<b>Traits:</b> Resources that have selected values for a monitored trait<br/>
<b>Plugin Configuration:</b> Search by the plugin component configurations of the component<br/>
<b>Resource Configuration:</b> Search by the configuration values of the managed resource
commit de58cb6d91c9c59d3f987a9de3097187602d35ad
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Mar 9 13:02:27 2010 -0500
add byteman plugin to the 'misc-plugins' group
diff --git a/modules/plugins/pom.xml b/modules/plugins/pom.xml
index 55e0546..d41b7b1 100644
--- a/modules/plugins/pom.xml
+++ b/modules/plugins/pom.xml
@@ -147,6 +147,7 @@
</activation>
<modules>
+ <module>byteman</module>
<module>iis</module>
<module>database</module>
<module>postgres</module>
commit 70c1d355bafeceadf48a78394aece6367f654e70
Author: Joseph Marques <joseph(a)redhat.com>
Date: Tue Mar 9 13:01:44 2010 -0500
update .classpath to reflect latest maven dependencies
diff --git a/.classpath b/.classpath
index 04464c1..23ccf82 100644
--- a/.classpath
+++ b/.classpath
@@ -186,10 +186,10 @@
<classpathentry exported="true" kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/javax/faces/jsf-api/1.2_12/jsf-api-1.2_12.jar" sourcepath="/M2_REPO/javax/faces/jsf-api/1.2_12/jsf-api-1.2_12-sources.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/javax/faces/jsf-impl/1.2_12/jsf-impl-1.2_12.jar" sourcepath="/M2_REPO/javax/faces/jsf-impl/1.2_12/jsf-impl-1.2_12-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/faces/jsf-api/1.2_14/jsf-api-1.2_14.jar" sourcepath="/M2_REPO/javax/faces/jsf-api/1.2_12/jsf-api-1.2_12-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/faces/jsf-impl/1.2_14/jsf-impl-1.2_14.jar" sourcepath="/M2_REPO/javax/faces/jsf-impl/1.2_12/jsf-impl-1.2_12-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/javax/el/el-api/1.0/el-api-1.0.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/com/sun/facelets/jsf-facelets/1.1.14/jsf-facelets-1.1.14.jar" sourcepath="/M2_REPO/com/sun/facelets/jsf-facelets/1.1.13/jsf-facelets-1.1.13-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/sun/facelets/jsf-facelets/1.1.15.B1/jsf-facelets-1.1.15.B1.jar" sourcepath="/M2_REPO/com/sun/facelets/jsf-facelets/1.1.13/jsf-facelets-1.1.13-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/mc4j/org-mc4j-ems/1.2.11/org-mc4j-ems-1.2.11.jar" sourcepath="/M2_REPO/mc4j/org-mc4j-ems/1.2.11/org-mc4j-ems-1.2.11-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/opensymphony/quartz/quartz/1.6.5/quartz-1.6.5.jar" sourcepath="/M2_REPO/org/opensymphony/quartz/quartz/1.6.5/quartz-1.6.5-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/javax/mail/mail/1.3.1/mail-1.3.1.jar"/>
@@ -210,7 +210,7 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/jvnet/inflector/0.7.0/inflector-0.7.0.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/net/augeas/augeas/0.0.1/augeas-0.0.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/json/json/20080701/json-20080701.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/com/sun/jna/jna/3.0.1/jna-3.0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/java/dev/jna/jna/3.2.2/jna-3.2.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.11/freemarker-2.3.11.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/seam/jboss-seam/2.1.0.SP1/jboss-seam-2.1.0.SP1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/seam/jboss-seam-ui/2.1.0.SP1/jboss-seam-ui-2.1.0.SP1.jar"/>
@@ -224,7 +224,7 @@
<classpathentry exported="true" kind="var" path="M2_REPO/org/apache/xmlrpc/xmlrpc-client/3.1.2/xmlrpc-client-3.1.2.jar" sourcepath="/M2_REPO/org/apache/xmlrpc/xmlrpc-client/3.1.2/xmlrpc-client-3.1.2-sources.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/apache/xmlrpc/xmlrpc-common/3.1.2/xmlrpc-common-3.1.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/org/apache/ws/commons/util/ws-commons-util/1.0.2/ws-commons-util-1.0.2.jar"/>
- <classpathentry exported="true" kind="var" path="M2_REPO/commons-digester/commons-digester/1.8/commons-digester-1.8.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-digester/commons-digester/1.8.1/commons-digester-1.8.1.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/pircbot/pircbot/1.4.2/pircbot-1.4.2.jar"/>
<classpathentry exported="true" kind="var" path="M2_REPO/net/homeip/yusuke/twitter4j/2.0.9/twitter4j-2.0.9.jar"/>
commit 26c0f53c1c70227e73a8722fc5ad7fe6b2812821
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 9 16:54:18 2010 +0100
Add operations sender plugin to final ear file
diff --git a/modules/enterprise/server/ear/pom.xml b/modules/enterprise/server/ear/pom.xml
index 191cf0a..2783255 100644
--- a/modules/enterprise/server/ear/pom.xml
+++ b/modules/enterprise/server/ear/pom.xml
@@ -306,6 +306,12 @@
<artifactItem>
<groupId>org.rhq</groupId>
+ <artifactId>alert-operations</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
+
+ <artifactItem>
+ <groupId>org.rhq</groupId>
<artifactId>alert-roles</artifactId>
<version>${project.version}</version>
</artifactItem>
commit 12bdcd68cfee7ef9eae1c03014cbca2a49917ed4
Merge: ac2e5aa... 5fe4ebe...
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 9 11:40:39 2010 +0100
Merge branch 'master' into alertPlugin
commit ac2e5aa1b5e2a511cc2809f7c15a2de9fa3d76b8
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 9 10:51:29 2010 +0100
Some cosmetics
diff --git a/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml b/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
index a3ad232..9f0ac31 100644
--- a/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
+++ b/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
@@ -12,9 +12,9 @@
<title>Operations sender</title>
</head>
<body>
-<h:panelGrid columns="2" style="vertical-align:top" >
- <h:panelGroup style="width:40%" >
- <rich:panel>
+<h:panelGrid columns="2" style="vertical-align:top;width:100%" >
+ <h:panelGroup>
+ <rich:panel style="vertical-align:top;width:30%" header="Select a resource">
<h:outputText value="Select mode"/>
<br/>
<h:form id="selectResourceForm">
@@ -26,8 +26,7 @@
<h:outputText value="Target resource "/>
<a href="#"
onclick="window.open('/rhq/inventory/resourcePicker.xhtml?formId=customContentForm:selectResourceForm&fieldId=resourceId', 'Pick a resource','width=800;height=500;scrollbars=yes,toolbar=no,resizable=yes,left=100,top=100'); return false;"
- class="buttonmed"
- alt="Resource Picker">Pick</a>
+ class="buttonmed">Pick</a>
<br/>
<h:inputText id="resourceId" title="Target Resource" value="#{operationsBean.resId}"/>
<p/>
@@ -41,8 +40,9 @@
</rich:panel>
</h:panelGroup>
- <h:panelGroup style="width:60%; vertical-align:top;" >
- <rich:panel rendered="#{not empty operationsBean.operationIds}">
+
+ <h:panelGroup style="vertical-align:top;" >
+ <rich:panel rendered="#{not empty operationsBean.operationIds}" style="vertical-align:top;width=70%" header="Select the operation">
Operations for: <h:outputText value=" #{operationsBean.resourceName}"/>
<br/>
@@ -63,7 +63,7 @@
<p/>
<h:panelGroup style="width:100%">
<h:messages />
- <rich:panel rendered="#{not empty operationsBean.operationId}">
+ <rich:panel rendered="#{not empty operationsBean.operationId}" header="Pass parameters to the operation">
<br/>
Parameters for operation '<h:outputText value=" #{operationsBean.operationName}"/>':
<p/>
commit 078d22c678e14b4c27506dfeadabd371c0a94c93
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 9 10:11:27 2010 +0100
Add findbugs plugin, so findbugs can be started with mvn findbugs:findbugs
diff --git a/pom.xml b/pom.xml
index 37afdcb..e2cc42b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,7 @@
<scm.branch>trunk</scm.branch>
<scm.module.path />
+ <findbugs.version>2.3</findbugs.version>
<doUpdate>false</doUpdate>
@@ -522,11 +523,18 @@
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <version>${findbugs.version}</version>
+ </plugin>
</plugins>
</pluginManagement>
<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
build artifacts. -->
@@ -1000,4 +1008,13 @@
</profiles>
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <version>2.3</version>
+ </plugin>
+ </plugins>
+ </reporting>
</project>
commit 4d053908d64ff908bfa54fa3195de44585a14a73
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Tue Mar 9 10:07:48 2010 +0100
Fix tab handling of the picker.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/layout/main-picker.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/layout/main-picker.xhtml
new file mode 100644
index 0000000..ca93979
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/layout/main-picker.xhtml
@@ -0,0 +1,73 @@
+<?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:rich="http://richfaces.ajax4jsf.org/rich"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:onc="http://jboss.org/on/component"
+ xmlns:onf="http://jboss.org/on/function">
+
+<ui:composition template="/rhq/entity/layout/main-wide.xhtml">
+
+<ui:param name="defaultPageTitle" value="Subsystem Views"/>
+
+ <ui:define name="summary"></ui:define>
+ <ui:define name="breadcrumbs"></ui:define>
+
+ <ui:define name="tabBar">
+ <a4j:region>
+ <h:form>
+ <a4j:poll interval="1200000" timeout="5000"
+ reRender="browserTabBarPanel" status="commonStatus" />
+ </h:form>
+ </a4j:region>
+
+
+ <onc:tabBar id="browserTabBarPanel" selectedTabName="#{selectedTabName}" >
+ <onc:tab name="Resources"
+ displayName="Resources #{InventorySummaryUIBean.resourceCount}"
+ url="/rhq/inventory/resourcePicker.xhtml?subtab=all&fieldId=#{param.fieldId}&formId=#{param.formId}">
+ <onc:subtab name="all"
+ displayName="All"
+ url="/rhq/inventory/resourcePicker.xhtml?subtab=all&fieldId=#{param.fieldId}&formId=#{param.formId}" />
+ <onc:subtab name="platform"
+ displayName="Platforms #{InventorySummaryUIBean.platformCount}"
+ url="/rhq/inventory/resourcePicker.xhtml?subtab=platform&fieldId=#{param.fieldId}&formId=#{param.formId}" />
+ <onc:subtab name="server"
+ displayName="Servers #{InventorySummaryUIBean.serverCount}"
+ url="/rhq/inventory/resourcePicker.xhtml?subtab=server&fieldId=#{param.fieldId}&formId=#{param.formId}" />
+ <onc:subtab name="service"
+ displayName="Services #{InventorySummaryUIBean.serviceCount}"
+ url="/rhq/inventory/resourcePicker.xhtml?subtab=service&fieldId=#{param.fieldId}&formId=#{param.formId}" />
+ </onc:tab>
+ </onc:tabBar>
+
+ <p />
+
+ <h:messages showSummary="true"
+ showDetail="true"
+ infoClass="InfoBlock"
+ warnClass="WarnBlock"
+ errorClass="ErrorBlock"
+ fatalClass="FatalBlock"
+ globalOnly="false"
+ layout="table"
+ width="100%"/>
+ </ui:define>
+
+ <ui:define name="content">
+ <p/>
+ <h1>Default Browser Content</h1>
+ <p/>
+ </ui:define>
+
+</ui:composition>
+
+</html>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml
index 19234be..79f5619 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml
@@ -15,14 +15,15 @@
xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-<ui:composition template="/rhq/inventory/layout/main.xhtml">
+<ui:composition template="/rhq/inventory/layout/main-picker.xhtml">
<ui:param name="pageTitle" value="Pick a Resource"/>
<ui:param name="selectedTabName" value="Resources.all" />
- <ui:param name="resourceTabOnly" value="true"/>
<ui:define name="content">
+ <ui:remove>TODO remove top level menu ?</ui:remove>
+
<a4j:keepAlive beanName="BrowseResourcesUIBean"/>
<h:form id="browseResourcesForm">
commit 8e982a1d2e579a18737112085157f43b7e675691
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 8 21:46:10 2010 +0100
Provide a resource-picker for users to select the target resource from a list.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml
new file mode 100644
index 0000000..19234be
--- /dev/null
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/resourcePicker.xhtml
@@ -0,0 +1,221 @@
+<?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:s="http://jboss.com/products/seam/taglib"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/inventory/layout/main.xhtml">
+
+
+ <ui:param name="pageTitle" value="Pick a Resource"/>
+ <ui:param name="selectedTabName" value="Resources.all" />
+ <ui:param name="resourceTabOnly" value="true"/>
+ <ui:define name="content">
+
+ <a4j:keepAlive beanName="BrowseResourcesUIBean"/>
+
+ <h:form id="browseResourcesForm">
+ <input type="hidden" name="subtab" value="all"/>
+
+ <p/>
+ <h:panelGroup>
+ <h:outputLabel for="filter" value="Search: " />
+ <h:inputText id="filter" value="#{BrowseResourcesUIBean.filter}"
+ onkeypress="return ignoreEnterKey(event);"
+ style="width: 600px;" />
+ <rich:suggestionbox id="suggest" for="filter"
+ tokens=",[]"
+ width="600" height="400"
+ border="1" cellpadding="1" cellspacing="1"
+ minChars="0"
+ first="0" rows="10"
+ frequency="0.1"
+ var="suggestItem"
+ fetchValue="#{suggestItem.value}"
+ suggestionAction="#{BrowseResourcesUIBean.autocomplete}"
+ nothingLabel="Start typing for simple text matches"
+ usingSuggestObjects="true"
+ eventsQueue="resourceSearchSuggestions"
+ ignoreDupResponses="true"
+ rendered="false"> <!-- disable until auto-completer is added -->
+ <h:column>
+ <h:outputText value="#{suggestItem.label}" />
+ </h:column>
+ </rich:suggestionbox>
+ <rich:spacer/>
+ <a4j:commandButton value="GO"
+ reRender="browseResourcesDataTable, browseResourcesDataTableScroller"
+ actionListener="#{BrowseResourcesUIBean.clearDataModel}"
+ styleClass="buttonmed">
+ <s:defaultAction/>
+ </a4j:commandButton>
+ </h:panelGroup>
+ <p/>
+
+ <h:panelGrid columns="1" width="100%">
+
+ <ui:param name="browseResourcesDataModel" value="#{BrowseResourcesUIBean.dataModel}"/>
+ <rich:dataTable id="browseResourcesDataTable"
+ rows="#{PageControl.BrowseResources.pageSize}"
+ value="#{browseResourcesDataModel}"
+ var="item"
+ width="100%"
+ columnsWidth="1%, 5%, 20%, 20%, 5%, 10%, 10%, 25%, 4%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+ onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+ onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
+ <onc:paginationControl id="BrowseResources" />
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:allSelect target="selectedItems" />
+ </f:facet>
+
+ <onc:select name="selectedItems"
+ value="#{item.original.resource.id}" />
+ </rich:column>
+
+ <rich:column>
+ <onc:quickNav>
+ <f:param name="id" value="#{item.original.resource.id}"/>
+
+ <!-- Is this necessary? It's being passed for all quick nav urls. -->
+ <f:param name="mode" value="list"/>
+ </onc:quickNav>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="r.name">
+ <h:outputText styleClass="headerText" value="Name" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.original.resource.name}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText" value="Parent" />
+ </f:facet>
+
+ <onc:resourcePartialLineage parents="#{item.parents}" renderLinks="false"/>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="r.resourceType.category">
+ <h:outputText styleClass="headerText" value="Category" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.original.resource.resourceType.category.name}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="r.resourceType.name">
+ <h:outputText styleClass="headerText" value="Type" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.original.resource.resourceType.name}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="r.resourceType.plugin">
+ <h:outputText styleClass="headerText" value="Plugin" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.original.resource.resourceType.plugin}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="r.description">
+ <h:outputText styleClass="headerText" value="Description" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.original.resource.description}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="r.currentAvailability.availabilityType">
+ <h:outputText styleClass="headerText" value="Availability" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:graphicImage value="#{onf:getAvailabilityURL(item.original.resource.currentAvailability.availabilityType, 16)}" />
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="9" width="100%">
+ <onc:selectCommandButton action="#"
+ value="Pick selected" target="selectedItems"
+ styleClass="on-pager-button buttonsmall"
+ rendered="#{GlobalPermissionsUIBean.inventory}"
+ low="1" high="1"
+ onclick="pick()"
+ />
+
+ <ui:param name="paginationDataTableName" value="browseResourcesDataTable"/>
+ <ui:param name="paginationDataModel" value="#{browseResourcesDataModel}"/>
+ <ui:param name="paginationPageControl" value="#{PageControl.BrowseResources}"/>
+ <ui:include src="/rhq/resource/include/pagination.xhtml"/>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+ </h:panelGrid>
+ </h:form>
+
+ <script type="text/javascript">
+ function pick() {
+ var targetField = opener.document.getElementById('#{param.formId}:#{param.fieldId}');
+
+ var theVal = -1;
+ var selectedCheckboxes = document.getElementsByName('selectedItems');
+ for (var i = 0; i < selectedCheckboxes.length; i++) {
+ if (selectedCheckboxes.item(i).checked) {
+ theVal = selectedCheckboxes.item(i).getAttribute("value");
+ break;
+ }
+ }
+
+ if (theVal > -1) {
+
+ targetField.value = theVal + "\n";
+
+ window.close();
+ }
+ }
+
+ </script>
+
+ </ui:define>
+
+</ui:composition>
+
+</html>
diff --git a/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml b/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
index dc3a917..a3ad232 100644
--- a/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
+++ b/modules/enterprise/server/plugins/alert-operations/src/main/resources/operations.xhtml
@@ -17,12 +17,17 @@
<rich:panel>
<h:outputText value="Select mode"/>
<br/>
+ <h:form id="selectResourceForm">
<h:selectOneMenu id="resMode" value="#{operationsBean.resMode}">
<f:selectItem itemValue="fixed" itemLabel="Resource ID"/>
<f:selectItem itemValue="deferred" itemLabel="Path to resource"/>
</h:selectOneMenu>
<p/>
- <h:outputText value="Target resource"/>
+ <h:outputText value="Target resource "/>
+ <a href="#"
+ onclick="window.open('/rhq/inventory/resourcePicker.xhtml?formId=customContentForm:selectResourceForm&fieldId=resourceId', 'Pick a resource','width=800;height=500;scrollbars=yes,toolbar=no,resizable=yes,left=100,top=100'); return false;"
+ class="buttonmed"
+ alt="Resource Picker">Pick</a>
<br/>
<h:inputText id="resourceId" title="Target Resource" value="#{operationsBean.resId}"/>
<p/>
@@ -32,6 +37,7 @@
action="#{operationsBean.selectResource}"
styleClass="buttonmed"
/>
+ </h:form>
</rich:panel>
</h:panelGroup>
@@ -83,5 +89,12 @@
</rich:panel>
</h:panelGroup>
+
+<rich:modalPanel id="ResourcePicker">
+
+ <h:outputLink>Hello World</h:outputLink>
+ <p/>
+ <a onclick="Richfaces.hideModalPanel('ResourcePicker');" href="#">Hide</a>
+</rich:modalPanel>
</body>
</html>
commit 8ff602afb09ad09e99c8af0a45ff551e6fb979bb
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 8 21:44:22 2010 +0100
Fix some typos.
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 ccb5d7d..15bf999 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
@@ -292,7 +292,7 @@ public class AlertNotificationManagerBean implements AlertNotificationManagerLoc
bean.internalInit();
}
catch (Throwable t ) {
- LOG.error("getBackinBean, calling backingBean.internalInit() resulted in " + t.getMessage());
+ LOG.error("getBackingBean, calling backingBean.internalInit() resulted in " + t.getMessage());
}
}
}
@@ -311,7 +311,7 @@ public class AlertNotificationManagerBean implements AlertNotificationManagerLoc
AlertDefinition definition = alertDefinitionManager.getAlertDefinition(user,alertDefinitionId);
if (definition==null) {
- LOG.error("DId not find definition for id [" + alertDefinitionId+ "]");
+ LOG.error("Did not find definition for id [" + alertDefinitionId+ "]");
return null;
}
@@ -340,7 +340,7 @@ public class AlertNotificationManagerBean implements AlertNotificationManagerLoc
public List<AlertNotification> getNotificationsForAlertDefinition(Subject user, int alertDefinitionId) {
AlertDefinition definition = alertDefinitionManager.getAlertDefinition(user,alertDefinitionId);
if (definition==null) {
- LOG.error("DId not find definition for id [" + alertDefinitionId+ "]");
+ LOG.error("Did not find definition for id [" + alertDefinitionId+ "]");
return new ArrayList<AlertNotification>();
}
commit 6d0672e2091f8a10ef82554141493afd7006b3ed
Merge: d7439a1... afb7b3a...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 13:49:42 2010 -0500
Merge branch 'bundle-jay' into bundle
commit afb7b3a768f42fb6db743ccab2f46a0a19e51643
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 13:49:26 2010 -0500
still a work in progress
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
index c524423..e91e9a1 100644
--- a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -28,6 +28,8 @@
var TestsEnabled = true;
+var bundleName "testScriptBundle"
+
// note, super-user, will not test any security constraints
var subject = rhq.login('rhqadmin', 'rhqadmin');
@@ -39,4 +41,37 @@ function testDeployment() {
if ( !TestsEnabled ) {
return;
}
+
+ var c = new BundleCriteria();
+ c.addFilterName( bundleName );
+ var bundles = BundleManager.findBundlesViaCriteria( c );
+ if ( null != bundles && bundles.size > 0 ) {
+ print( "\n Deleting existing testScriptBundle in order to test a fresh deploy...")
+ BundleManager.deleteBundle( bundles.get(0).getId() );
+ }
+
+ var testBundle = createBundle( bundleName, getBundleType() );
+ BundleVersion bv1 = createBundleVersion(bundleName, null, getBundleType());
+ Configuration config = new Configuration();
+ config.put(new PropertySimple("bundletest.property", "bundletest.property value"));
+ BundleDeployDefinition bdd1 = createDeployDefinition("one", bv1, config);
+ assertNotNull(bdd1);
+ Resource platformResource = createTestResource();
+ BundleScheduleResponse bsr = bundleManager.scheduleBundleDeployment(overlord, bdd1.getId(), platformResource
+ .getId());
+ assertNotNull(bsr);
+ assertEquals(bdd1.getId(), bsr.getBundleDeployment().getBundleDeployDefinition().getId());
+ assertEquals(platformResource.getId(), bsr.getBundleDeployment().getResource().getId());
+
+}
+
+function getBundleType() {
+
+ var types = BundleManager.getAllBundleTypes();
+ for ( int i=0; ( i < types.size()); ++i ) {
+ if ( types.get(i).getName().toUppercase().contains("TEMPLATE") ) {
+ return types.get(i).getId();
+ }
+
+ print( "\n Could not find template bundle type, is the plugin loaded?");
}
commit d7439a19f9a151f4b09a37d1b3e302177e0d3763
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 12:01:33 2010 -0500
git forced LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
index 6d6be4a..ae79536 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
@@ -1,253 +1,253 @@
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
-<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
-<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
-<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
-<%@ page import="javax.naming.InitialContext" %>
-<%@ page import="javax.persistence.EntityManager" %>
-<%@ page import="javax.persistence.EntityManagerFactory" %>
-<%@ page import="javax.persistence.Id" %>
-<%@ page import="java.beans.BeanInfo" %>
-<%@ page import="java.beans.Introspector" %>
-<%@ page import="java.beans.PropertyDescriptor" %>
-<%@ page import="java.beans.PropertyEditor" %>
-<%@ page import="java.beans.PropertyEditorManager" %>
-<%@ page import="java.lang.reflect.Field" %>
-<%@ page import="java.lang.reflect.Method" %>
-<%@ page import="java.util.Collection" %>
-<%@ page import="java.util.Iterator" %>
-<%@ page import="java.util.List" %>
-<%@ page import="java.util.Map" %>
-<%@ page import="java.util.SortedSet" %>
-<%@ page import="java.util.TreeSet" %>
-<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>EJB3 Entity browser</title>
- </head>
- <body>
-
- <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
-
- <h1>Entity browser</h1>
- ${param.entityClass}
-
- <c:if test="${param.pEntity != null}">
- <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
- <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
- </c:if>
-
- <%
- InitialContext ic = new InitialContext();
-
- EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
- EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
- .createEntityManager();
-
-
- org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
- SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
-
- %>
-
-
- <c:if test="${param.entityClass == null}">
- <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
-
- <%
-
- Map<String, Object> metadata = sfi.getAllClassMetadata();
- SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
-
- %>
-
- <ul>
-
- <%
- for (String className : classes) {
- Object val = metadata.get(className);
- String url = "browser.jsp?entityClass=" + className;
-
- className = className.replaceFirst(".*\\.(.*\\..*)","$1");
-
- out.println(
- " <li><a href=\"" + url + "\">" + className +"</a></li>");
- }
- %>
-
-
- </ul>
- </c:if>
-
-
- <c:if test="${param.entityClass != null}">
- <c:set var="entityClass" value="${param.entityClass}"/>
- </c:if>
-
- <c:if test="${param.mode == 'delete'}">
- <%
- String entityName = (String)pageContext.getRequest().getParameter("entityClass");
- String key = (String)pageContext.getRequest().getParameter("key");
-
- em.remove(em.find(Class.forName(entityName),key));
- entityName = (String) pageContext.getRequest().getParameter("pEntity");
- key = (String) pageContext.getRequest().getParameter("pKey");
- ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
- "browser.jsp?entityClass=" + entityName + "&key=" + key);
- if (true)
- return;
- %></c:if>
-
-
- <c:if test="${param.key == null}">
- <h3>Listing ${entityClass}</h3>
- <%
- String entityName = (String)pageContext.findAttribute("entityClass");
- entityName = entityName.substring(entityName.lastIndexOf('.')+1);
- List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
-
- pageContext.setAttribute("values", values);%>
- <c:forEach var="entity" items="${values}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
- <a href="${url}">${entity}</a><br>
- </c:forEach>
-
- </c:if>
-
- <c:if test="${param.key != null}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
- <h3>Details of ${entityClass} (${param.key})</h3>
- <a href="${url}">List all ${entityClass}</a><br>
- <%
- Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
- Object entity = em.find(entityType,
- getConvertedKey(entityType,
- pageContext.getRequest().getParameter("key")));
- pageContext.setAttribute("entity",entity);
-
-
- BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
- PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
- int ln = pds.length;
- %>
- <c:set var="entity" value="${entity}"/>
- String view: ${entity}
-
- <h4>Simple Properties</h4>
- <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
- <%
- int i = 0;
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
-
- if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
- out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
-
- Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
- if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
- java.lang.reflect.Method idMethod = null;
- try {
- idMethod = reference.getClass().getMethod("getId", new Class[0]);
- } catch (NoSuchMethodException nsme) { }
- if (idMethod != null) {
- try {
- Object id = idMethod.invoke(reference,new Object[0]);
- pageContext.setAttribute("child", reference);
- String className = reference.getClass().getName();
- if (className.indexOf('_') > 0) {
- className = className.substring(0,className.indexOf('_'));
- }
- pageContext.setAttribute("cType", className);
-
- %>
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a><br>
- <%
- } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
-
- out.println("</td></tr>");
- }
- }
- %>
- </table>
-
-
- <%
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
- if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
- out.println("<h4>" + pd.getName() + ": </h4><ul>");
-
- Method readMethod = pd.getReadMethod();
- if (readMethod != null) {
- Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
- for (Iterator iter = c.iterator(); iter.hasNext(); ) {
- Object child = iter.next();
- pageContext.setAttribute("child", child);
- pageContext.setAttribute("cType", child.getClass().getName());
- %>
- <c:catch var="foo">
- <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a>
-
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
- <a href="${url}"><font color="red">x</font></a>
-
- </li>
- </c:catch>
- <%
- }
- }
- out.write("</ul>");
- }
- }
- %>
-
-
- </c:if>
-
-
- <%!
- public Object getConvertedKey(Class type, Object key) {
- Class keyType = getKeyType(type);
- System.out.println("Key type is: " + keyType);
- PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
- if (ed != null) {
- ed.setAsText(String.valueOf(key));
- return ed.getValue();
- } else {
- return key;
- }
- }
-
- public Class getKeyType(Class type) {
- Field[] fields = type.getDeclaredFields();
- for (Field f : fields) {
- Id id = f.getAnnotation(javax.persistence.Id.class);
- if (id != null) {
- return f.getType();
- }
- }
-
- return Integer.class;
- }
-
- %>
- </body>
-</html>
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
+<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
+<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
+<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
+<%@ page import="javax.naming.InitialContext" %>
+<%@ page import="javax.persistence.EntityManager" %>
+<%@ page import="javax.persistence.EntityManagerFactory" %>
+<%@ page import="javax.persistence.Id" %>
+<%@ page import="java.beans.BeanInfo" %>
+<%@ page import="java.beans.Introspector" %>
+<%@ page import="java.beans.PropertyDescriptor" %>
+<%@ page import="java.beans.PropertyEditor" %>
+<%@ page import="java.beans.PropertyEditorManager" %>
+<%@ page import="java.lang.reflect.Field" %>
+<%@ page import="java.lang.reflect.Method" %>
+<%@ page import="java.util.Collection" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.Map" %>
+<%@ page import="java.util.SortedSet" %>
+<%@ page import="java.util.TreeSet" %>
+<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>EJB3 Entity browser</title>
+ </head>
+ <body>
+
+ <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
+
+ <h1>Entity browser</h1>
+ ${param.entityClass}
+
+ <c:if test="${param.pEntity != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
+ <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
+ </c:if>
+
+ <%
+ InitialContext ic = new InitialContext();
+
+ EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
+ EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
+ .createEntityManager();
+
+
+ org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
+ SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
+
+ %>
+
+
+ <c:if test="${param.entityClass == null}">
+ <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
+
+ <%
+
+ Map<String, Object> metadata = sfi.getAllClassMetadata();
+ SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
+
+ %>
+
+ <ul>
+
+ <%
+ for (String className : classes) {
+ Object val = metadata.get(className);
+ String url = "browser.jsp?entityClass=" + className;
+
+ className = className.replaceFirst(".*\\.(.*\\..*)","$1");
+
+ out.println(
+ " <li><a href=\"" + url + "\">" + className +"</a></li>");
+ }
+ %>
+
+
+ </ul>
+ </c:if>
+
+
+ <c:if test="${param.entityClass != null}">
+ <c:set var="entityClass" value="${param.entityClass}"/>
+ </c:if>
+
+ <c:if test="${param.mode == 'delete'}">
+ <%
+ String entityName = (String)pageContext.getRequest().getParameter("entityClass");
+ String key = (String)pageContext.getRequest().getParameter("key");
+
+ em.remove(em.find(Class.forName(entityName),key));
+ entityName = (String) pageContext.getRequest().getParameter("pEntity");
+ key = (String) pageContext.getRequest().getParameter("pKey");
+ ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
+ "browser.jsp?entityClass=" + entityName + "&key=" + key);
+ if (true)
+ return;
+ %></c:if>
+
+
+ <c:if test="${param.key == null}">
+ <h3>Listing ${entityClass}</h3>
+ <%
+ String entityName = (String)pageContext.findAttribute("entityClass");
+ entityName = entityName.substring(entityName.lastIndexOf('.')+1);
+ List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
+
+ pageContext.setAttribute("values", values);%>
+ <c:forEach var="entity" items="${values}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
+ <a href="${url}">${entity}</a><br>
+ </c:forEach>
+
+ </c:if>
+
+ <c:if test="${param.key != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
+ <h3>Details of ${entityClass} (${param.key})</h3>
+ <a href="${url}">List all ${entityClass}</a><br>
+ <%
+ Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
+ Object entity = em.find(entityType,
+ getConvertedKey(entityType,
+ pageContext.getRequest().getParameter("key")));
+ pageContext.setAttribute("entity",entity);
+
+
+ BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
+ PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
+ int ln = pds.length;
+ %>
+ <c:set var="entity" value="${entity}"/>
+ String view: ${entity}
+
+ <h4>Simple Properties</h4>
+ <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
+ <%
+ int i = 0;
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+
+ if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
+ out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
+
+ Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
+ if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
+ java.lang.reflect.Method idMethod = null;
+ try {
+ idMethod = reference.getClass().getMethod("getId", new Class[0]);
+ } catch (NoSuchMethodException nsme) { }
+ if (idMethod != null) {
+ try {
+ Object id = idMethod.invoke(reference,new Object[0]);
+ pageContext.setAttribute("child", reference);
+ String className = reference.getClass().getName();
+ if (className.indexOf('_') > 0) {
+ className = className.substring(0,className.indexOf('_'));
+ }
+ pageContext.setAttribute("cType", className);
+
+ %>
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a><br>
+ <%
+ } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+
+ out.println("</td></tr>");
+ }
+ }
+ %>
+ </table>
+
+
+ <%
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+ if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
+ out.println("<h4>" + pd.getName() + ": </h4><ul>");
+
+ Method readMethod = pd.getReadMethod();
+ if (readMethod != null) {
+ Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
+ for (Iterator iter = c.iterator(); iter.hasNext(); ) {
+ Object child = iter.next();
+ pageContext.setAttribute("child", child);
+ pageContext.setAttribute("cType", child.getClass().getName());
+ %>
+ <c:catch var="foo">
+ <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a>
+
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
+ <a href="${url}"><font color="red">x</font></a>
+
+ </li>
+ </c:catch>
+ <%
+ }
+ }
+ out.write("</ul>");
+ }
+ }
+ %>
+
+
+ </c:if>
+
+
+ <%!
+ public Object getConvertedKey(Class type, Object key) {
+ Class keyType = getKeyType(type);
+ System.out.println("Key type is: " + keyType);
+ PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
+ if (ed != null) {
+ ed.setAsText(String.valueOf(key));
+ return ed.getValue();
+ } else {
+ return key;
+ }
+ }
+
+ public Class getKeyType(Class type) {
+ Field[] fields = type.getDeclaredFields();
+ for (Field f : fields) {
+ Id id = f.getAnnotation(javax.persistence.Id.class);
+ if (id != null) {
+ return f.getType();
+ }
+ }
+
+ return Integer.class;
+ }
+
+ %>
+ </body>
+</html>
diff --git a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
index 2cde42e..87dacfe 100644
--- a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
+++ b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
@@ -1,145 +1,145 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2006, JBoss Inc. All rights reserved.
- */
-
-package org.rhq.plugins.hibernate.test;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.discovery.InventoryReport;
-import org.rhq.core.domain.measurement.MeasurementData;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementReport;
-import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.pluginapi.inventory.ResourceComponent;
-import org.rhq.core.pluginapi.measurement.MeasurementFacet;
-import org.rhq.core.pc.PluginContainer;
-import org.rhq.core.pc.PluginContainerConfiguration;
-import org.rhq.core.pc.plugin.FileSystemPluginFinder;
-import org.rhq.core.pc.plugin.PluginEnvironment;
-import org.rhq.core.pc.plugin.PluginManager;
-
-/**
- * @author Greg Hinkle
- */
-@Test(groups = "hibernate-plugin")
-public class HibernatePluginTest
-{
- private Log log = LogFactory.getLog(HibernatePluginTest.class);
- private static final String PLUGIN_NAME = "Hibernate";
-
- @BeforeSuite
- public void start()
- {
- try
- {
- File pluginDir = new File("target/itest/plugins");
- PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
- pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
- pcConfig.setPluginDirectory(pluginDir);
-
- pcConfig.setInsideAgent(false);
- PluginContainer.getInstance().setConfiguration(pcConfig);
- PluginContainer.getInstance().initialize();
- log.info("PC started.");
- for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
- log.info("...Loaded plugin: " + plugin);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
- @AfterSuite
- public void stop()
- {
- PluginContainer.getInstance().shutdown();
- }
-
- @Test
- public void testPluginLoad()
- {
- PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
- PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
- assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
- assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
- }
-
- @Test(dependsOnMethods = "testPluginLoad")
- public void testDiscovery() throws Exception
- {
- InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
- System.out.println("Found " + resources.size() + " hibernate services");
- }
-
- @Test(dependsOnMethods = "testDiscovery")
- public void testMeasurement() throws Exception
- {
- for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
- {
- testResourceMeasurement(server);
- }
- }
-
- private Set<Resource> findResource(Resource parent, String typeName)
- {
- Set<Resource> found = new HashSet<Resource>();
- @SuppressWarnings({"UnnecessaryLocalVariable"})
- Resource platform = parent;
- for (Resource resource : platform.getChildResources())
- {
- if (resource.getResourceType().getName().equals(typeName))
- {
- found.add(resource);
- }
- if (resource.getChildResources() != null)
- {
- for (Resource child : found)
- {
- found.addAll(findResource(child,typeName));
- }
- }
- }
- return found;
- }
-
- private void testResourceMeasurement(Resource resource)throws Exception
- {
- ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
- if (resourceComponent instanceof MeasurementFacet)
- {
- for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
- {
- Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
- metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
- MeasurementReport report = new MeasurementReport();
- ((MeasurementFacet) resourceComponent).getValues(report, metricList);
-
- assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
- MeasurementData data = report.getNumericData().iterator().next();
- assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
- System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
- }
- }
- }
-}
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc. All rights reserved.
+ */
+
+package org.rhq.plugins.hibernate.test;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.discovery.InventoryReport;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.plugin.FileSystemPluginFinder;
+import org.rhq.core.pc.plugin.PluginEnvironment;
+import org.rhq.core.pc.plugin.PluginManager;
+
+/**
+ * @author Greg Hinkle
+ */
+@Test(groups = "hibernate-plugin")
+public class HibernatePluginTest
+{
+ private Log log = LogFactory.getLog(HibernatePluginTest.class);
+ private static final String PLUGIN_NAME = "Hibernate";
+
+ @BeforeSuite
+ public void start()
+ {
+ try
+ {
+ File pluginDir = new File("target/itest/plugins");
+ PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
+ pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
+ pcConfig.setPluginDirectory(pluginDir);
+
+ pcConfig.setInsideAgent(false);
+ PluginContainer.getInstance().setConfiguration(pcConfig);
+ PluginContainer.getInstance().initialize();
+ log.info("PC started.");
+ for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
+ log.info("...Loaded plugin: " + plugin);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterSuite
+ public void stop()
+ {
+ PluginContainer.getInstance().shutdown();
+ }
+
+ @Test
+ public void testPluginLoad()
+ {
+ PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
+ PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
+ assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
+ assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
+ }
+
+ @Test(dependsOnMethods = "testPluginLoad")
+ public void testDiscovery() throws Exception
+ {
+ InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
+ System.out.println("Found " + resources.size() + " hibernate services");
+ }
+
+ @Test(dependsOnMethods = "testDiscovery")
+ public void testMeasurement() throws Exception
+ {
+ for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
+ {
+ testResourceMeasurement(server);
+ }
+ }
+
+ private Set<Resource> findResource(Resource parent, String typeName)
+ {
+ Set<Resource> found = new HashSet<Resource>();
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ Resource platform = parent;
+ for (Resource resource : platform.getChildResources())
+ {
+ if (resource.getResourceType().getName().equals(typeName))
+ {
+ found.add(resource);
+ }
+ if (resource.getChildResources() != null)
+ {
+ for (Resource child : found)
+ {
+ found.addAll(findResource(child,typeName));
+ }
+ }
+ }
+ return found;
+ }
+
+ private void testResourceMeasurement(Resource resource)throws Exception
+ {
+ ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
+ if (resourceComponent instanceof MeasurementFacet)
+ {
+ for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
+ {
+ Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
+ metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
+ MeasurementReport report = new MeasurementReport();
+ ((MeasurementFacet) resourceComponent).getValues(report, metricList);
+
+ assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
+ MeasurementData data = report.getNumericData().iterator().next();
+ assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
+ System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
+ }
+ }
+ }
+}
commit f4b06f9feb0c7099f080574a54ddb9a5b17b3b4b
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 12:00:25 2010 -0500
remove generation of mock entries for demo
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 67cbaf6..b213501 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -65,7 +65,6 @@ import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
@@ -495,15 +494,6 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
public PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria) {
- Query totalCountQuery = PersistenceUtility.createCountQuery(entityManager, Bundle.QUERY_FIND_ALL);
- long totalCount = (Long) totalCountQuery.getSingleResult();
- if (totalCount == 0) {
- List<BundleType> bundleTypes = getAllBundleTypes(subject);
- for (int i = 0; i < 50; i++) {
- createMockBundle(subject, bundleTypes);
- }
- }
-
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
CriteriaQueryRunner<Bundle> queryRunner = new CriteriaQueryRunner<Bundle>(criteria, generator, entityManager);
commit b4c04a87817cecd9edc0cdbcddc5367c4d570959
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 11:59:53 2010 -0500
Git forced LT commit
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
index 6d6be4a..ae79536 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/admin/test/browser.jsp
@@ -1,253 +1,253 @@
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
-<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
-<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
-<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
-<%@ page import="javax.naming.InitialContext" %>
-<%@ page import="javax.persistence.EntityManager" %>
-<%@ page import="javax.persistence.EntityManagerFactory" %>
-<%@ page import="javax.persistence.Id" %>
-<%@ page import="java.beans.BeanInfo" %>
-<%@ page import="java.beans.Introspector" %>
-<%@ page import="java.beans.PropertyDescriptor" %>
-<%@ page import="java.beans.PropertyEditor" %>
-<%@ page import="java.beans.PropertyEditorManager" %>
-<%@ page import="java.lang.reflect.Field" %>
-<%@ page import="java.lang.reflect.Method" %>
-<%@ page import="java.util.Collection" %>
-<%@ page import="java.util.Iterator" %>
-<%@ page import="java.util.List" %>
-<%@ page import="java.util.Map" %>
-<%@ page import="java.util.SortedSet" %>
-<%@ page import="java.util.TreeSet" %>
-<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>EJB3 Entity browser</title>
- </head>
- <body>
-
- <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
-
- <h1>Entity browser</h1>
- ${param.entityClass}
-
- <c:if test="${param.pEntity != null}">
- <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
- <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
- </c:if>
-
- <%
- InitialContext ic = new InitialContext();
-
- EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
- EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
- .createEntityManager();
-
-
- org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
- SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
-
- %>
-
-
- <c:if test="${param.entityClass == null}">
- <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
-
- <%
-
- Map<String, Object> metadata = sfi.getAllClassMetadata();
- SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
-
- %>
-
- <ul>
-
- <%
- for (String className : classes) {
- Object val = metadata.get(className);
- String url = "browser.jsp?entityClass=" + className;
-
- className = className.replaceFirst(".*\\.(.*\\..*)","$1");
-
- out.println(
- " <li><a href=\"" + url + "\">" + className +"</a></li>");
- }
- %>
-
-
- </ul>
- </c:if>
-
-
- <c:if test="${param.entityClass != null}">
- <c:set var="entityClass" value="${param.entityClass}"/>
- </c:if>
-
- <c:if test="${param.mode == 'delete'}">
- <%
- String entityName = (String)pageContext.getRequest().getParameter("entityClass");
- String key = (String)pageContext.getRequest().getParameter("key");
-
- em.remove(em.find(Class.forName(entityName),key));
- entityName = (String) pageContext.getRequest().getParameter("pEntity");
- key = (String) pageContext.getRequest().getParameter("pKey");
- ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
- "browser.jsp?entityClass=" + entityName + "&key=" + key);
- if (true)
- return;
- %></c:if>
-
-
- <c:if test="${param.key == null}">
- <h3>Listing ${entityClass}</h3>
- <%
- String entityName = (String)pageContext.findAttribute("entityClass");
- entityName = entityName.substring(entityName.lastIndexOf('.')+1);
- List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
-
- pageContext.setAttribute("values", values);%>
- <c:forEach var="entity" items="${values}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
- <a href="${url}">${entity}</a><br>
- </c:forEach>
-
- </c:if>
-
- <c:if test="${param.key != null}">
- <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
- <h3>Details of ${entityClass} (${param.key})</h3>
- <a href="${url}">List all ${entityClass}</a><br>
- <%
- Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
- Object entity = em.find(entityType,
- getConvertedKey(entityType,
- pageContext.getRequest().getParameter("key")));
- pageContext.setAttribute("entity",entity);
-
-
- BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
- PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
- int ln = pds.length;
- %>
- <c:set var="entity" value="${entity}"/>
- String view: ${entity}
-
- <h4>Simple Properties</h4>
- <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
- <%
- int i = 0;
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
-
- if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
- out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
-
- Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
- if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
- java.lang.reflect.Method idMethod = null;
- try {
- idMethod = reference.getClass().getMethod("getId", new Class[0]);
- } catch (NoSuchMethodException nsme) { }
- if (idMethod != null) {
- try {
- Object id = idMethod.invoke(reference,new Object[0]);
- pageContext.setAttribute("child", reference);
- String className = reference.getClass().getName();
- if (className.indexOf('_') > 0) {
- className = className.substring(0,className.indexOf('_'));
- }
- pageContext.setAttribute("cType", className);
-
- %>
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a><br>
- <%
- } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
- } else {
- try {
- out.println(reference);
- } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
- }
-
- out.println("</td></tr>");
- }
- }
- %>
- </table>
-
-
- <%
- for (i = 0; i < ln; i++) {
- PropertyDescriptor pd = pds[i];
- if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
- out.println("<h4>" + pd.getName() + ": </h4><ul>");
-
- Method readMethod = pd.getReadMethod();
- if (readMethod != null) {
- Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
- for (Iterator iter = c.iterator(); iter.hasNext(); ) {
- Object child = iter.next();
- pageContext.setAttribute("child", child);
- pageContext.setAttribute("cType", child.getClass().getName());
- %>
- <c:catch var="foo">
- <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
- <a href="${url}">${child}</a>
-
- <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
- <a href="${url}"><font color="red">x</font></a>
-
- </li>
- </c:catch>
- <%
- }
- }
- out.write("</ul>");
- }
- }
- %>
-
-
- </c:if>
-
-
- <%!
- public Object getConvertedKey(Class type, Object key) {
- Class keyType = getKeyType(type);
- System.out.println("Key type is: " + keyType);
- PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
- if (ed != null) {
- ed.setAsText(String.valueOf(key));
- return ed.getValue();
- } else {
- return key;
- }
- }
-
- public Class getKeyType(Class type) {
- Field[] fields = type.getDeclaredFields();
- for (Field f : fields) {
- Id id = f.getAnnotation(javax.persistence.Id.class);
- if (id != null) {
- return f.getType();
- }
- }
-
- return Integer.class;
- }
-
- %>
- </body>
-</html>
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<%@ page import="org.hibernate.engine.SessionFactoryImplementor" %>
+<%@ page import="org.rhq.core.domain.util.PersistenceUtility" %>
+<%@ page import="org.rhq.enterprise.gui.legacy.util.SessionUtils" %>
+<%@ page import="org.rhq.enterprise.server.util.LookupUtil" %>
+<%@ page import="javax.naming.InitialContext" %>
+<%@ page import="javax.persistence.EntityManager" %>
+<%@ page import="javax.persistence.EntityManagerFactory" %>
+<%@ page import="javax.persistence.Id" %>
+<%@ page import="java.beans.BeanInfo" %>
+<%@ page import="java.beans.Introspector" %>
+<%@ page import="java.beans.PropertyDescriptor" %>
+<%@ page import="java.beans.PropertyEditor" %>
+<%@ page import="java.beans.PropertyEditorManager" %>
+<%@ page import="java.lang.reflect.Field" %>
+<%@ page import="java.lang.reflect.Method" %>
+<%@ page import="java.util.Collection" %>
+<%@ page import="java.util.Iterator" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.Map" %>
+<%@ page import="java.util.SortedSet" %>
+<%@ page import="java.util.TreeSet" %>
+<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>EJB3 Entity browser</title>
+ </head>
+ <body>
+
+ <jsp:include page="/admin/include/adminTestLinks.html" flush="true" />
+
+ <h1>Entity browser</h1>
+ ${param.entityClass}
+
+ <c:if test="${param.pEntity != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${param.pEntity}&key=${param.pKey}"/>
+ <a href="${url}">Up to ${param.pEntity} (${param.pKey})</a>
+ </c:if>
+
+ <%
+ InitialContext ic = new InitialContext();
+
+ EntityManagerFactory emf = (EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory");
+ EntityManager em = ((EntityManagerFactory) ic.lookup("java:/RHQEntityManagerFactory"))
+ .createEntityManager();
+
+
+ org.hibernate.Session s = PersistenceUtility.getHibernateSession(em);
+ SessionFactoryImplementor sfi = (SessionFactoryImplementor) s.getSessionFactory();
+
+ %>
+
+
+ <c:if test="${param.entityClass == null}">
+ <c:set var="entityClass" value="org.rhq.core.domain.resource.Resource"/>
+
+ <%
+
+ Map<String, Object> metadata = sfi.getAllClassMetadata();
+ SortedSet<String> classes = new TreeSet<String>(metadata.keySet());
+
+ %>
+
+ <ul>
+
+ <%
+ for (String className : classes) {
+ Object val = metadata.get(className);
+ String url = "browser.jsp?entityClass=" + className;
+
+ className = className.replaceFirst(".*\\.(.*\\..*)","$1");
+
+ out.println(
+ " <li><a href=\"" + url + "\">" + className +"</a></li>");
+ }
+ %>
+
+
+ </ul>
+ </c:if>
+
+
+ <c:if test="${param.entityClass != null}">
+ <c:set var="entityClass" value="${param.entityClass}"/>
+ </c:if>
+
+ <c:if test="${param.mode == 'delete'}">
+ <%
+ String entityName = (String)pageContext.getRequest().getParameter("entityClass");
+ String key = (String)pageContext.getRequest().getParameter("key");
+
+ em.remove(em.find(Class.forName(entityName),key));
+ entityName = (String) pageContext.getRequest().getParameter("pEntity");
+ key = (String) pageContext.getRequest().getParameter("pKey");
+ ((HttpServletResponse)pageContext.getResponse()).sendRedirect(
+ "browser.jsp?entityClass=" + entityName + "&key=" + key);
+ if (true)
+ return;
+ %></c:if>
+
+
+ <c:if test="${param.key == null}">
+ <h3>Listing ${entityClass}</h3>
+ <%
+ String entityName = (String)pageContext.findAttribute("entityClass");
+ entityName = entityName.substring(entityName.lastIndexOf('.')+1);
+ List values = em.createQuery("from " + entityName + " d").setMaxResults(100).getResultList();
+
+ pageContext.setAttribute("values", values);%>
+ <c:forEach var="entity" items="${values}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}&key=${entity.id}"/>
+ <a href="${url}">${entity}</a><br>
+ </c:forEach>
+
+ </c:if>
+
+ <c:if test="${param.key != null}">
+ <c:url var="url" value="browser.jsp?entityClass=${entityClass}"/>
+ <h3>Details of ${entityClass} (${param.key})</h3>
+ <a href="${url}">List all ${entityClass}</a><br>
+ <%
+ Class entityType = Class.forName((String)pageContext.findAttribute("entityClass"));
+ Object entity = em.find(entityType,
+ getConvertedKey(entityType,
+ pageContext.getRequest().getParameter("key")));
+ pageContext.setAttribute("entity",entity);
+
+
+ BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass());
+ PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
+ int ln = pds.length;
+ %>
+ <c:set var="entity" value="${entity}"/>
+ String view: ${entity}
+
+ <h4>Simple Properties</h4>
+ <table border="1"><tr><td align="right"><b>Name</b></td><td><b>Value</b></td></tr>
+ <%
+ int i = 0;
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+
+ if (!Collection.class.isAssignableFrom(pd.getPropertyType()) ) {
+ out.println("<tr><td align='right'><b>" + pd.getName() + ": </b></td><td>");
+
+ Object reference = pd.getReadMethod() == null ? "-cant read-" : pd.getReadMethod().invoke(entity, new Object[]{});
+ if (reference != null && reference.getClass().getName().startsWith("org.rhq.core.domain")) {
+ java.lang.reflect.Method idMethod = null;
+ try {
+ idMethod = reference.getClass().getMethod("getId", new Class[0]);
+ } catch (NoSuchMethodException nsme) { }
+ if (idMethod != null) {
+ try {
+ Object id = idMethod.invoke(reference,new Object[0]);
+ pageContext.setAttribute("child", reference);
+ String className = reference.getClass().getName();
+ if (className.indexOf('_') > 0) {
+ className = className.substring(0,className.indexOf('_'));
+ }
+ pageContext.setAttribute("cType", className);
+
+ %>
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a><br>
+ <%
+ } catch (Exception e) { out.println("{exception: " + e.toString() + "}"); }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+ } else {
+ try {
+ out.println(reference);
+ } catch (Exception e) { out.println("<i>" + e.getClass().getSimpleName() + "</i>"); }
+ }
+
+ out.println("</td></tr>");
+ }
+ }
+ %>
+ </table>
+
+
+ <%
+ for (i = 0; i < ln; i++) {
+ PropertyDescriptor pd = pds[i];
+ if (Collection.class.isAssignableFrom(pd.getPropertyType())) {
+ out.println("<h4>" + pd.getName() + ": </h4><ul>");
+
+ Method readMethod = pd.getReadMethod();
+ if (readMethod != null) {
+ Collection c = (Collection) readMethod.invoke(entity, new Object[]{});
+ for (Iterator iter = c.iterator(); iter.hasNext(); ) {
+ Object child = iter.next();
+ pageContext.setAttribute("child", child);
+ pageContext.setAttribute("cType", child.getClass().getName());
+ %>
+ <c:catch var="foo">
+ <li><c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}"/>
+ <a href="${url}">${child}</a>
+
+ <c:url var="url" value="browser.jsp?entityClass=${cType}&key=${child.id}&pEntity=${entityClass}&pKey=${param.key}&mode=delete"/>
+ <a href="${url}"><font color="red">x</font></a>
+
+ </li>
+ </c:catch>
+ <%
+ }
+ }
+ out.write("</ul>");
+ }
+ }
+ %>
+
+
+ </c:if>
+
+
+ <%!
+ public Object getConvertedKey(Class type, Object key) {
+ Class keyType = getKeyType(type);
+ System.out.println("Key type is: " + keyType);
+ PropertyEditor ed = PropertyEditorManager.findEditor(keyType);
+ if (ed != null) {
+ ed.setAsText(String.valueOf(key));
+ return ed.getValue();
+ } else {
+ return key;
+ }
+ }
+
+ public Class getKeyType(Class type) {
+ Field[] fields = type.getDeclaredFields();
+ for (Field f : fields) {
+ Id id = f.getAnnotation(javax.persistence.Id.class);
+ if (id != null) {
+ return f.getType();
+ }
+ }
+
+ return Integer.class;
+ }
+
+ %>
+ </body>
+</html>
diff --git a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
index 2cde42e..87dacfe 100644
--- a/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
+++ b/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate/test/HibernatePluginTest.java
@@ -1,145 +1,145 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2006, JBoss Inc. All rights reserved.
- */
-
-package org.rhq.plugins.hibernate.test;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
-import org.rhq.core.domain.discovery.InventoryReport;
-import org.rhq.core.domain.measurement.MeasurementData;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementReport;
-import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.pluginapi.inventory.ResourceComponent;
-import org.rhq.core.pluginapi.measurement.MeasurementFacet;
-import org.rhq.core.pc.PluginContainer;
-import org.rhq.core.pc.PluginContainerConfiguration;
-import org.rhq.core.pc.plugin.FileSystemPluginFinder;
-import org.rhq.core.pc.plugin.PluginEnvironment;
-import org.rhq.core.pc.plugin.PluginManager;
-
-/**
- * @author Greg Hinkle
- */
-@Test(groups = "hibernate-plugin")
-public class HibernatePluginTest
-{
- private Log log = LogFactory.getLog(HibernatePluginTest.class);
- private static final String PLUGIN_NAME = "Hibernate";
-
- @BeforeSuite
- public void start()
- {
- try
- {
- File pluginDir = new File("target/itest/plugins");
- PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
- pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
- pcConfig.setPluginDirectory(pluginDir);
-
- pcConfig.setInsideAgent(false);
- PluginContainer.getInstance().setConfiguration(pcConfig);
- PluginContainer.getInstance().initialize();
- log.info("PC started.");
- for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
- log.info("...Loaded plugin: " + plugin);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
- @AfterSuite
- public void stop()
- {
- PluginContainer.getInstance().shutdown();
- }
-
- @Test
- public void testPluginLoad()
- {
- PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
- PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
- assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
- assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
- }
-
- @Test(dependsOnMethods = "testPluginLoad")
- public void testDiscovery() throws Exception
- {
- InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
- assert report != null;
- System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
-
- Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
- System.out.println("Found " + resources.size() + " hibernate services");
- }
-
- @Test(dependsOnMethods = "testDiscovery")
- public void testMeasurement() throws Exception
- {
- for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
- {
- testResourceMeasurement(server);
- }
- }
-
- private Set<Resource> findResource(Resource parent, String typeName)
- {
- Set<Resource> found = new HashSet<Resource>();
- @SuppressWarnings({"UnnecessaryLocalVariable"})
- Resource platform = parent;
- for (Resource resource : platform.getChildResources())
- {
- if (resource.getResourceType().getName().equals(typeName))
- {
- found.add(resource);
- }
- if (resource.getChildResources() != null)
- {
- for (Resource child : found)
- {
- found.addAll(findResource(child,typeName));
- }
- }
- }
- return found;
- }
-
- private void testResourceMeasurement(Resource resource)throws Exception
- {
- ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
- if (resourceComponent instanceof MeasurementFacet)
- {
- for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
- {
- Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
- metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
- MeasurementReport report = new MeasurementReport();
- ((MeasurementFacet) resourceComponent).getValues(report, metricList);
-
- assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
- MeasurementData data = report.getNumericData().iterator().next();
- assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
- System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
- }
- }
- }
-}
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc. All rights reserved.
+ */
+
+package org.rhq.plugins.hibernate.test;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.discovery.InventoryReport;
+import org.rhq.core.domain.measurement.MeasurementData;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.pluginapi.inventory.ResourceComponent;
+import org.rhq.core.pluginapi.measurement.MeasurementFacet;
+import org.rhq.core.pc.PluginContainer;
+import org.rhq.core.pc.PluginContainerConfiguration;
+import org.rhq.core.pc.plugin.FileSystemPluginFinder;
+import org.rhq.core.pc.plugin.PluginEnvironment;
+import org.rhq.core.pc.plugin.PluginManager;
+
+/**
+ * @author Greg Hinkle
+ */
+@Test(groups = "hibernate-plugin")
+public class HibernatePluginTest
+{
+ private Log log = LogFactory.getLog(HibernatePluginTest.class);
+ private static final String PLUGIN_NAME = "Hibernate";
+
+ @BeforeSuite
+ public void start()
+ {
+ try
+ {
+ File pluginDir = new File("target/itest/plugins");
+ PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
+ pcConfig.setPluginFinder(new FileSystemPluginFinder(pluginDir));
+ pcConfig.setPluginDirectory(pluginDir);
+
+ pcConfig.setInsideAgent(false);
+ PluginContainer.getInstance().setConfiguration(pcConfig);
+ PluginContainer.getInstance().initialize();
+ log.info("PC started.");
+ for (String plugin : PluginContainer.getInstance().getPluginManager().getMetadataManager().getPluginNames()) {
+ log.info("...Loaded plugin: " + plugin);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ @AfterSuite
+ public void stop()
+ {
+ PluginContainer.getInstance().shutdown();
+ }
+
+ @Test
+ public void testPluginLoad()
+ {
+ PluginManager pluginManager = PluginContainer.getInstance().getPluginManager();
+ PluginEnvironment pluginEnvironment = pluginManager.getPlugin(PLUGIN_NAME);
+ assert (pluginEnvironment != null) : "Null environment, plugin not loaded";
+ assert (pluginEnvironment.getPluginName().equals(PLUGIN_NAME));
+ }
+
+ @Test(dependsOnMethods = "testPluginLoad")
+ public void testDiscovery() throws Exception
+ {
+ InventoryReport report = PluginContainer.getInstance().getInventoryManager().executeServerScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ report = PluginContainer.getInstance().getInventoryManager().executeServiceScanImmediately();
+ assert report != null;
+ System.out.println("Discovery took: " + (report.getEndTime() - report.getStartTime()) + "ms");
+
+ Set<Resource> resources = findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics");
+ System.out.println("Found " + resources.size() + " hibernate services");
+ }
+
+ @Test(dependsOnMethods = "testDiscovery")
+ public void testMeasurement() throws Exception
+ {
+ for (Resource server : findResource(PluginContainer.getInstance().getInventoryManager().getPlatform(), "Hibernate Statistics"))
+ {
+ testResourceMeasurement(server);
+ }
+ }
+
+ private Set<Resource> findResource(Resource parent, String typeName)
+ {
+ Set<Resource> found = new HashSet<Resource>();
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ Resource platform = parent;
+ for (Resource resource : platform.getChildResources())
+ {
+ if (resource.getResourceType().getName().equals(typeName))
+ {
+ found.add(resource);
+ }
+ if (resource.getChildResources() != null)
+ {
+ for (Resource child : found)
+ {
+ found.addAll(findResource(child,typeName));
+ }
+ }
+ }
+ return found;
+ }
+
+ private void testResourceMeasurement(Resource resource)throws Exception
+ {
+ ResourceComponent resourceComponent = PluginContainer.getInstance().getInventoryManager().getResourceComponent(resource);
+ if (resourceComponent instanceof MeasurementFacet)
+ {
+ for (MeasurementDefinition def : resource.getResourceType().getMetricDefinitions())
+ {
+ Set<MeasurementScheduleRequest> metricList = new HashSet<MeasurementScheduleRequest>();
+ metricList.add(new MeasurementScheduleRequest(1, def.getName(), 1000, true, def.getDataType(), null));
+ MeasurementReport report = new MeasurementReport();
+ ((MeasurementFacet) resourceComponent).getValues(report, metricList);
+
+ assert report.getNumericData().size() > 0 : "Measurement " + def.getName() + " not collected from " + resource;
+ MeasurementData data = report.getNumericData().iterator().next();
+ assert data != null : "Unable to collect metric [" + def.getName() + "] on " + resource;
+ System.out.println("Measurement: " + def.getName() + "=" + data.getValue());
+ }
+ }
+ }
+}
commit 1ccead99d4d23a3cfb6083d87d018da021223a46
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 11:59:18 2010 -0500
Refactor for easier merge into gwt branch
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertCriteria.java
index 119924b..ac44fd8 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertCriteria.java
@@ -29,8 +29,8 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
-import org.rhq.core.domain.alert.AlertPriority;
import org.rhq.core.domain.alert.Alert;
+import org.rhq.core.domain.alert.AlertPriority;
import org.rhq.core.domain.util.PageOrdering;
/**
@@ -65,7 +65,7 @@ public class AlertCriteria extends Criteria {
private PageOrdering sortPriority; // requires overrides
public AlertCriteria() {
- super(Alert.class);
+ super();
filterOverrides.put("triggeredOperationName", "triggeredOperation like ?");
filterOverrides.put("startTime", "ctime >= ?");
@@ -88,6 +88,10 @@ public class AlertCriteria extends Criteria {
sortOverrides.put("priority", "alertDefinition.priority");
}
+ public Class<Alert> getPersistentClass() {
+ return Alert.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
index 7f16a8e..89bc1a1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
@@ -29,8 +29,8 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
-import org.rhq.core.domain.alert.AlertPriority;
import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.alert.AlertPriority;
import org.rhq.core.domain.util.PageOrdering;
/**
@@ -62,7 +62,7 @@ public class AlertDefinitionCriteria extends Criteria {
private PageOrdering sortPriority;
public AlertDefinitionCriteria() {
- super(AlertDefinition.class);
+ super();
filterOverrides.put("alertTemplateParentId", "parentId = ?");
filterOverrides.put("alertTemplateResourceTypeId", "resourceType.id = ?");
@@ -71,6 +71,10 @@ public class AlertDefinitionCriteria extends Criteria {
filterOverrides.put("operationName", "operationDefinition.name like ?");
}
+ public Class<AlertDefinition> getPersistentClass() {
+ return AlertDefinition.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
index aed446a..d58622c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleCriteria.java
@@ -43,12 +43,16 @@ public class BundleCriteria extends Criteria {
private boolean fetchRepo;
public BundleCriteria() {
- super(Bundle.class);
+ super();
filterOverrides.put("bundleTypeId", "bundleType.id = ?");
filterOverrides.put("bundleTypeName", "bundleType.name like ?");
}
+ public Class<Bundle> getPersistentClass() {
+ return Bundle.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
index 975e137..6398891 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeployDefinitionCriteria.java
@@ -44,7 +44,11 @@ public class BundleDeployDefinitionCriteria extends Criteria {
private boolean fetchDeployments;
public BundleDeployDefinitionCriteria() {
- super(BundleDeployDefinition.class);
+ super();
+ }
+
+ public Class<BundleDeployDefinition> getPersistentClass() {
+ return BundleDeployDefinition.class;
}
public void addFilterId(Integer filterId) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
index cbbdcaf..e138f64 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
@@ -45,7 +45,7 @@ public class BundleDeploymentCriteria extends Criteria {
private boolean fetchHistory;
public BundleDeploymentCriteria() {
- super(BundleDeployment.class);
+ super();
filterOverrides.put("resourceId", "resource.id = ?");
filterOverrides.put("resourceName", "resource.name like ?");
@@ -53,6 +53,10 @@ public class BundleDeploymentCriteria extends Criteria {
filterOverrides.put("bundleDeployDefinitionName", "parentResource.name like ?");
}
+ public Class<BundleDeployment> getPersistentClass() {
+ return BundleDeployment.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
index a459be5..094152a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
@@ -42,10 +42,14 @@ public class BundleDeploymentHistoryCriteria extends Criteria {
public Integer filterBundleDeploymentDefinitionId;
public BundleDeploymentHistoryCriteria() {
- super(BundleDeploymentHistory.class);
+ super();
}
+ public Class<BundleDeploymentHistory> getPersistentClass() {
+ return BundleDeploymentHistory.class;
+ }
+
public void setFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java
index 5264a76..703fd8d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleVersionCriteria.java
@@ -46,11 +46,15 @@ public class BundleVersionCriteria extends Criteria {
private boolean fetchConfigurationDefinition;
public BundleVersionCriteria() {
- super(BundleVersion.class);
+ super();
filterOverrides.put("bundleName", "bundle.name like ?");
}
+ public Class<BundleVersion> getPersistentClass() {
+ return BundleVersion.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
index dd943e0..e895859 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
@@ -68,16 +68,7 @@ public abstract class Criteria implements Serializable {
private List<String> orderingFieldNames;
- private Class<?> persistentClass;
-
- //added no args constructor for bean and JAXB requirement
- @SuppressWarnings("unused")
- private Criteria() {
- }
-
- public Criteria(Class<?> persistentClass) {
- this.persistentClass = persistentClass;
-
+ public Criteria() {
filterOverrides = new HashMap<String, String>();
sortOverrides = new HashMap<String, String>();
@@ -90,9 +81,7 @@ public abstract class Criteria implements Serializable {
setPaging(0, 200);
}
- public Class<?> getPersistentClass() {
- return persistentClass;
- }
+ public abstract Class<?> getPersistentClass();
private List<Field> getFields(Type fieldType) {
String prefix = fieldType.name().toLowerCase();
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/EventCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/EventCriteria.java
index 1a39995..dde0ab1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/EventCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/EventCriteria.java
@@ -54,7 +54,7 @@ public class EventCriteria extends Criteria {
private PageOrdering sortSeverity;
public EventCriteria() {
- super(Event.class);
+ super();
filterOverrides.put("sourceName", "source.eventDefinition.name like ?");
filterOverrides.put("startTime", "timestamp >= ?");
@@ -77,6 +77,10 @@ public class EventCriteria extends Criteria {
+ " WHERE parent.id = ? )");
}
+ public Class<Event> getPersistentClass() {
+ return Event.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageCriteria.java
index 0713324..6c86443 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageCriteria.java
@@ -3,8 +3,8 @@ package org.rhq.core.domain.criteria;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
-import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.content.InstalledPackage;
+import org.rhq.core.domain.util.PageOrdering;
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("unused")
@@ -25,7 +25,7 @@ public class InstalledPackageCriteria extends Criteria {
private PageOrdering sortInstallationDate;
public InstalledPackageCriteria() {
- super(InstalledPackage.class);
+ super();
filterOverrides.put("installationTimeMinimum", "installationDate >= ?");
filterOverrides.put("installationTimeMaximum", "installationDate <= ?");
@@ -34,6 +34,10 @@ public class InstalledPackageCriteria extends Criteria {
filterOverrides.put("userId", "user.id = ? ");
}
+ public Class<InstalledPackage> getPersistentClass() {
+ return InstalledPackage.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDefinitionCriteria.java
index 4c45ef6..cd6a454 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDefinitionCriteria.java
@@ -28,9 +28,9 @@ import javax.xml.bind.annotation.XmlAccessorType;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.DisplayType;
import org.rhq.core.domain.measurement.MeasurementCategory;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.measurement.NumericType;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.util.PageOrdering;
/**
@@ -67,7 +67,7 @@ public class MeasurementDefinitionCriteria extends Criteria {
private PageOrdering sortDefaultInterval;
public MeasurementDefinitionCriteria() {
- super(MeasurementDefinition.class);
+ super();
filterOverrides.put("resourceTypeName", "resourceType.name like ?");
filterOverrides.put("resourceTypeId", "resourceType.id = ?");
@@ -75,6 +75,10 @@ public class MeasurementDefinitionCriteria extends Criteria {
sortOverrides.put("resourceTypeName", "resourceType.name");
}
+ public Class<MeasurementDefinition> getPersistentClass() {
+ return MeasurementDefinition.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementScheduleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementScheduleCriteria.java
index 268e57a..72119df 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementScheduleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementScheduleCriteria.java
@@ -53,7 +53,7 @@ public class MeasurementScheduleCriteria extends Criteria {
private PageOrdering sortName; // requires overrides
public MeasurementScheduleCriteria() {
- super(MeasurementSchedule.class);
+ super();
filterOverrides.put("definitionIds", "definition.id IN ( ? )");
filterOverrides.put("resourceId", "resource.id IN ( ? )");
@@ -76,6 +76,10 @@ public class MeasurementScheduleCriteria extends Criteria {
sortOverrides.put("name", "definition.name");
}
+ public Class<MeasurementSchedule> getPersistentClass() {
+ return MeasurementSchedule.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationDefinitionCriteria.java
index c6aa98e..f8b00f1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationDefinitionCriteria.java
@@ -28,8 +28,8 @@ import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
-import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.operation.OperationDefinition;
+import org.rhq.core.domain.util.PageOrdering;
/**
* @author Joseph Marques
@@ -56,7 +56,7 @@ public class OperationDefinitionCriteria extends Criteria {
private PageOrdering sortName;
public OperationDefinitionCriteria() {
- super(OperationDefinition.class);
+ super();
filterOverrides.put("resourceTypeId", "resourceType.id = ?");
filterOverrides.put("resourceTypeName", "resourceType.name like ?");
@@ -73,6 +73,10 @@ public class OperationDefinitionCriteria extends Criteria {
+ " WHERE group.id = ? ) ");
}
+ public Class<OperationDefinition> getPersistentClass() {
+ return OperationDefinition.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationHistoryCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationHistoryCriteria.java
index 79dfec2..1c495d2 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationHistoryCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/OperationHistoryCriteria.java
@@ -26,8 +26,8 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import org.rhq.core.domain.operation.JobId;
-import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.operation.OperationHistory;
+import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.util.PageOrdering;
/**
@@ -56,16 +56,23 @@ public abstract class OperationHistoryCriteria extends Criteria {
private PageOrdering sortEndTime; // requires override
private PageOrdering sortOperationName; // requires override
+ Class<? extends OperationHistory> clazz;
+
public OperationHistoryCriteria() {
- super(OperationHistory.class);
- init();
+ this(OperationHistory.class);
}
protected OperationHistoryCriteria(Class<? extends OperationHistory> clazz) {
- super(clazz);
+ super();
+
+ this.clazz = clazz;
init();
}
+ public Class<? extends OperationHistory> getPersistentClass() {
+ return this.clazz;
+ }
+
private void init() {
filterOverrides.put("operationDefinitionId", "operationDefinition.id = ?");
filterOverrides.put("operationName", "operationDefinition.name like ?");
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/PackageVersionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/PackageVersionCriteria.java
index 4a0d4bb..f66775b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/PackageVersionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/PackageVersionCriteria.java
@@ -35,7 +35,7 @@ public class PackageVersionCriteria extends Criteria {
private PageOrdering sortDisplayName;
public PackageVersionCriteria() {
- super(PackageVersion.class);
+ super();
filterOverrides.put("repoId", "id IN " //
+ "( SELECT cpv.packageVersion.id" //
@@ -51,6 +51,10 @@ public class PackageVersionCriteria extends Criteria {
+ " WHERE ip.resource.id = ? )");
}
+ public Class<PackageVersion> getPersistentClass() {
+ return PackageVersion.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RepoCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RepoCriteria.java
index 188c955..e2c4747 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RepoCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RepoCriteria.java
@@ -55,13 +55,15 @@ public class RepoCriteria extends Criteria {
private PageOrdering sortName;
public RepoCriteria() {
- super(Repo.class);
+ super();
filterOverrides.put("resourceIds", "resourceRepos.resource.id IN ( ? )");
- filterOverrides.put("contentSourceIds",
- "id IN (SELECT innerRepo FROM Repo innerRepo " +
- "JOIN innerRepo.repoContentSources rcs " +
- "WHERE rcs.contentSource.id IN ( ? ))");
+ filterOverrides.put("contentSourceIds", "id IN (SELECT innerRepo FROM Repo innerRepo "
+ + "JOIN innerRepo.repoContentSources rcs " + "WHERE rcs.contentSource.id IN ( ? ))");
+ }
+
+ public Class<Repo> getPersistentClass() {
+ return Repo.class;
}
public void addFilterId(Integer filterId) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java
index a695476..84c9ce5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceCriteria.java
@@ -91,7 +91,7 @@ public class ResourceCriteria extends Criteria {
private PageOrdering sortCurrentAvailability; // needs overrides
public ResourceCriteria() {
- super(Resource.class);
+ super();
filterOverrides.put("resourceTypeId", "resourceType.id = ?");
filterOverrides.put("resourceTypeName", "resourceType.name like ?");
@@ -110,6 +110,10 @@ public class ResourceCriteria extends Criteria {
sortOverrides.put("currentAvailability", "currentAvailability.availabilityType");
}
+ public Class<Resource> getPersistentClass() {
+ return Resource.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
index dab95e8..7c1b4b8 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
@@ -62,7 +62,7 @@ public class ResourceGroupCriteria extends Criteria {
private PageOrdering sortResourceTypeName; // requires overrides
public ResourceGroupCriteria() {
- super(ResourceGroup.class);
+ super();
filterOverrides.put("resourceTypeId", "resourceType.id = ?");
filterOverrides.put("resourceTypeName", "resourceType.name like ?");
@@ -81,6 +81,10 @@ public class ResourceGroupCriteria extends Criteria {
sortOverrides.put("resourceTypeName", "resourceType.name");
}
+ public Class<ResourceGroup> getPersistentClass() {
+ return ResourceGroup.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java
index 184c3bd..79f4ff8 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceTypeCriteria.java
@@ -68,13 +68,17 @@ public class ResourceTypeCriteria extends Criteria {
private PageOrdering sortPluginName; // needs overrides
public ResourceTypeCriteria() {
- super(ResourceType.class);
+ super();
filterOverrides.put("pluginName", "plugin like ?");
sortOverrides.put("pluginName", "plugin");
}
+ public Class<ResourceType> getPersistentClass() {
+ return ResourceType.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
index 9b63c01..7f6509a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
@@ -48,7 +48,11 @@ public class RoleCriteria extends Criteria {
private PageOrdering sortName;
public RoleCriteria() {
- super(Role.class);
+ super();
+ }
+
+ public Class<Role> getPersistentClass() {
+ return Role.class;
}
public Integer getFilterId() {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java
index bd70b6f..a316a9b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SavedSearchCriteria.java
@@ -58,7 +58,7 @@ public class SavedSearchCriteria extends Criteria {
private PageOrdering sortGlobal;
public SavedSearchCriteria() {
- super(SavedSearch.class);
+ super();
filterOverrides.put("lastComputeTimeMin", "lastComputeTime >= ?");
filterOverrides.put("lastComputeTimeMax", "lastComputeTime <= ?");
@@ -66,6 +66,10 @@ public class SavedSearchCriteria extends Criteria {
filterOverrides.put("resultCountMax", "resultCount <= ?");
}
+ public Class<SavedSearch> getPersistentClass() {
+ return SavedSearch.class;
+ }
+
public void addFilterId(Integer filterId) {
this.filterId = filterId;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java
index 43e156e..06a4ab0 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java
@@ -25,8 +25,8 @@ package org.rhq.core.domain.criteria;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
-import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.util.PageOrdering;
/**
* @author Joseph Marques
@@ -59,7 +59,11 @@ public class SubjectCriteria extends Criteria {
private PageOrdering sortDepartment;
public SubjectCriteria() {
- super(Subject.class);
+ super();
+ }
+
+ public Class<Subject> getPersistentClass() {
+ return Subject.class;
}
public void addFilterId(Integer filterId) {
commit da6c146b71619e0c9b263ab33d280830200e310d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 10:55:27 2010 -0500
Finish move of most API to the remote and declare as WS endpoints. Minor
API refactoring.
diff --git a/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
new file mode 100644
index 0000000..c524423
--- /dev/null
+++ b/modules/enterprise/remoting/scripts/src/test/script/org/rhq/enterprise/remoting/cli/test_bundleManager.js
@@ -0,0 +1,42 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * Thus test script works with a real env including at least one platform resource and a running agent on
+ * said platform.
+ */
+
+var TestsEnabled = true;
+
+// note, super-user, will not test any security constraints
+var subject = rhq.login('rhqadmin', 'rhqadmin');
+
+executeAllTests();
+
+rhq.logout();
+
+function testDeployment() {
+ if ( !TestsEnabled ) {
+ return;
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index 1aaad05..67cbaf6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -110,6 +110,14 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
@EJB
private ResourceTypeManagerLocal resourceTypeManager;
+ // TODO: I don't think this is adequate, need to link to the deployment
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public void addBundleDeploymentHistoryByBundleDeployment(Subject subject, BundleDeploymentHistory history)
+ throws Exception {
+
+ entityManager.persist(history);
+ }
+
@RequiredPermission(Permission.MANAGE_INVENTORY)
public Bundle createBundle(Subject subject, String name, int bundleTypeId) {
if (null == name || "".equals(name.trim())) {
@@ -467,6 +475,17 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return queryRunner.execute();
}
+ // TODO: I don't think this criteria search is necessary
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
+ BundleDeploymentHistoryCriteria criteria) {
+
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
+
+ CriteriaQueryRunner<BundleDeploymentHistory> queryRunner = new CriteriaQueryRunner<BundleDeploymentHistory>(
+ criteria, generator, entityManager);
+ return queryRunner.execute();
+ }
+
public PageList<BundleVersion> findBundleVersionsByCriteria(Subject subject, BundleVersionCriteria criteria) {
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
@@ -491,24 +510,21 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return queryRunner.execute();
}
- public PageList<BundleDeployment> findBundleDeploymentsByCriteria(BundleDeploymentCriteria criteria) {
- // TODO Auto-generated method stub
- return null;
- }
-
- public void deleteBundles(Subject subject, int[] bundleIds) {
- for (int bundleId : bundleIds) {
- Bundle bundle = this.entityManager.find(Bundle.class, bundleId);
- this.entityManager.remove(bundle);
- }
+ // TODO This is not adequate!!!
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public void deleteBundle(Subject subject, int bundleId) throws Exception {
+ Bundle bundle = this.entityManager.find(Bundle.class, bundleId);
+ this.entityManager.remove(bundle);
}
+ /*
public void deleteBundleVersions(Subject subject, int[] bundleVersionIds) {
for (int bundleVersionId : bundleVersionIds) {
BundleVersion bundleVersion = this.entityManager.find(BundleVersion.class, bundleVersionId);
this.entityManager.remove(bundleVersion);
}
}
+ */
public BundleType createMockBundleType(Subject subject) {
@@ -553,18 +569,4 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return bundle;
}
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
- BundleDeploymentHistoryCriteria criteria) {
-
- Query q = entityManager.createNamedQuery(BundleDeploymentHistory.QUERY_FIND_ALL);
- List<BundleDeploymentHistory> histories = (List<BundleDeploymentHistory>) q.getResultList();
- return histories;
- }
-
- public void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history)
- throws IllegalArgumentException {
-
- entityManager.persist(history);
-
- }
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index ba28693..df7758a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@ -18,20 +18,12 @@
*/
package org.rhq.enterprise.server.bundle;
-import java.io.InputStream;
-import java.util.Set;
-
import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.bundle.Bundle;
-import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
-import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
-import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.content.Architecture;
/**
* Local interface to the manager responsible for creating and managing bundles.
@@ -41,72 +33,21 @@ import org.rhq.core.domain.content.Architecture;
@Local
public interface BundleManagerLocal extends BundleManagerRemote {
- /**
- * Adds a BundleFile to the BundleVersion and implicitly creates the backing PackageVersion. If the PackageVersion
- * already exists use {@link addBundleFile(Subject, int, String, int, boolean)}
- *
- * @param subject must be InventoryManager
- * @param bundleVersionId id of the BundleVersion incorporating this BundleFile
- * @param name name of the BundleFile (and the resulting Package)
- * @param version version of the backing package
- * @param architecture architecture appropriate for the backing package. Defaults to noarch (i.e. any architecture).
- * @param fileStream the file bits
- * @param pinToPackage if true a new version of the backing package can trigger automatic creation of a new
- * BundleVersion. if false new versions of the backing package have no effect on the BundleFile or its BundleVersion.
- * @return the new BundleFile
- * @throws Exception
- */
- BundleFile addBundleFile(Subject subject, int bundleVersionId, String bundleFileName, String version,
- Architecture architecture, InputStream fileStream, boolean pinToPackage) throws Exception;
+ // Methods in the Local are not exposed to the remote API. This is is typically due to:
+ // - used strictly for internal processing (like generating history records)
+ // - transactional reasons (like needing REQUIRES_NEW)
+ // - security reasons
+ // - used for testing only
+ // - legacy reasons
/**
- * A convenience method taking a byte array as opposed to a stream for the file bits.
+ * Called internally to add history when action is taken against a deployment.
*
- * @see {@link addBundleFile(Subject, int, String, String, Architecture, InputStream, boolean)}
- */
- BundleFile addBundleFileViaByteArray(Subject subject, int bundleVersionId, String name, String version,
- Architecture architecture, byte[] fileBytes, boolean pinToPackage) throws Exception;
-
- /**
- * @param subject must be InventoryManager
- * @param bundleVersionId id of the BundleVersion incorporating this BundleFile
- * @param name name of the BundleFile (and the resulting Package)
- * @param packageVersionId id of the PackageVersion this BundleFile is tied to for this BundleVersion. It is assumed
- * the PackageVersion is already associated with the Bundle's Repo and the package is classified for the
- * Bundle.
- * @param pinToPackage if true a new version of the backing package can trigger automatic creation of a new
- * BundleVersion. if false new versions of the backing package have no effect on the BundleFile or its BundleVersion.
- * @return the new BundleFile
- * @throws Exception
- */
- BundleFile addBundleFileViaPackageVersion(Subject subject, int bundleVersionId, String name, int packageVersionId,
- boolean pinToPackage) throws Exception;
-
- /**
- * @param subject must be InventoryManager
- * @param name not null or empty
- * @param bundleTypeId valid bundleType
- * @return the persisted Bundle (id is assigned)
- */
- Bundle createBundle(Subject subject, String name, int bundleTypeId) throws Exception;
-
- /**
- * @param subject must be InventoryManager
- * @param BundleVersionId the BundleVersion being deployed by this definition
- * @param name a name for this definition. not null or empty
- * @param description an optional longer description describing this deploy def
- * @param configuration a Configuration (pojo) to be associated with this deploy def. Although
- * it is not enforceable
- * must be that of the associated BundleVersion.
- * @param enforcePolicy if true enforce policy on deployments made with this deploy def
- * @param enforceInterval if enforcePolicy is true check policy at this interval (in seconds), otherwise ignored
- * @param pinToBundle if true this deploy def is disabled if a newer BundleVersion is generated for the Bundle
- * @return
- * @throws Exception
+ * @param subject
+ * @param history
*/
- BundleDeployDefinition createBundleDeployDefinition(Subject subject, int bundleVersionId, String name,
- String description, Configuration configuration, boolean enforcePolicy, int enforcementInterval,
- boolean pinToBundle) throws Exception;
+ void addBundleDeploymentHistoryByBundleDeployment(Subject subject, BundleDeploymentHistory history)
+ throws Exception;
/**
* Not generally called. For use by Server Side Plugins when registering a Bundle Plugin.
@@ -119,39 +60,9 @@ public interface BundleManagerLocal extends BundleManagerRemote {
BundleType createBundleType(Subject subject, String name, int resourceTypeId) throws Exception;
/**
- * @param subject must be InventoryManager
- * @param bundleId the bundle for which this will be the next version
- * @param name not null or empty
- * @param bundleVersion optional. If not supplied set to 1.0 for first version, or incremented (as best as possible) for subsequent version
- * @return the persisted BundleVersion (id is assigned)
- */
- BundleVersion createBundleVersion(Subject subject, int bundleId, String name, String bundleVersion, String recipe)
- throws Exception;
-
- /**
* This is typically not called directly, typically deployBundle() is called externally. This executes
* in a New Transaction and supports deployBundle.
*/
BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception;
-
- /**
- * Determine the files required for a BundleVersion and return all of the filenames or optionally, just those
- * that lack BundleFiles for the BundleVersion. The recipe may be parsed as part of this call.
- *
- * @param subject must be InventoryManager
- * @param bundleVersionId the BundleVersion being queried
- * @param withoutBundleFileOnly if true omit any filenames that already have a corresponding BundleFile for
- * the BundleVersion.
- * @return The List of filenames.
- * @throws Exception
- */
- Set<String> getBundleVersionFilenames(Subject subject, int bundleVersionId, boolean withoutBundleFileOnly)
- throws Exception;
-
- //
- // Methods shared with remote have been removed
- // This interface now extends remote instead
- //
-
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 11b024f..467cec9 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -18,7 +18,9 @@
*/
package org.rhq.enterprise.server.bundle;
+import java.io.InputStream;
import java.util.List;
+import java.util.Set;
import javax.ejb.Remote;
import javax.jws.WebMethod;
@@ -32,8 +34,11 @@ import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
@@ -51,26 +56,165 @@ import org.rhq.enterprise.server.system.ServerVersion;
@WebService(targetNamespace = ServerVersion.namespace)
@Remote
public interface BundleManagerRemote {
+
+ /**
+ * Adds a BundleFile to the BundleVersion and implicitly creates the backing PackageVersion. If the PackageVersion
+ * already exists use {@link addBundleFile(Subject, int, String, int, boolean)}
+ *
+ * @param subject must be InventoryManager
+ * @param bundleVersionId id of the BundleVersion incorporating this BundleFile
+ * @param name name of the BundleFile (and the resulting Package)
+ * @param version version of the backing package
+ * @param architecture architecture appropriate for the backing package. Defaults to noarch (i.e. any architecture).
+ * @param fileStream the file bits
+ * @param pinToPackage if true a new version of the backing package can trigger automatic creation of a new
+ * BundleVersion. if false new versions of the backing package have no effect on the BundleFile or its BundleVersion.
+ * @return the new BundleFile
+ * @throws Exception
+ */
@WebMethod
- List<BundleType> getAllBundleTypes( //
- @WebParam(name = "subject") Subject subject);
+ BundleFile addBundleFile( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleVersionid") int bundleVersionId, //
+ @WebParam(name = "name") String name, //
+ @WebParam(name = "version") String version, //
+ @WebParam(name = "architecture") Architecture architecture, //
+ @WebParam(name = "fileStream") InputStream fileStream, //
+ @WebParam(name = "pinToPackage") boolean pinToPackage) throws Exception;
- PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria);
+ /**
+ * A convenience method taking a byte array as opposed to a stream for the file bits.
+ *
+ * @see {@link addBundleFile(Subject, int, String, String, Architecture, InputStream, boolean)}
+ */
+ BundleFile addBundleFileViaByteArray( //
+ @WebParam(name = "subject") Subject subject, @WebParam(name = "bundleVersionid") int bundleVersionId, //
+ @WebParam(name = "name") String name, //
+ @WebParam(name = "version") String version, //
+ @WebParam(name = "architecture") Architecture architecture, //
+ @WebParam(name = "fileBytes") byte[] fileBytes, //
+ @WebParam(name = "pinToPackage") boolean pinToPackage) throws Exception;
- PageList<BundleVersion> findBundleVersionsByCriteria(Subject subject, BundleVersionCriteria criteria);
+ /**
+ * A convenience method taking an existing PackageVersion as opposed to a stream for the file bits.
+ *
+ * @see {@link addBundleFile(Subject, int, String, String, Architecture, InputStream, boolean)}
+ */
+ BundleFile addBundleFileViaPackageVersion( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleVersionid") int bundleVersionId, //
+ @WebParam(name = "name") String name, //
+ @WebParam(name = "packageVersionId") int packageVersionId, //
+ @WebParam(name = "pinToPackage") boolean pinToPackage) throws Exception;
- PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
- BundleDeployDefinitionCriteria criteria);
+ /**
+ * @param subject must be InventoryManager
+ * @param name not null or empty
+ * @param bundleTypeId valid bundleType
+ * @return the persisted Bundle (id is assigned)
+ */
+ Bundle createBundle( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "name") String name, //
+ @WebParam(name = "bundleTypeId") int bundleTypeId) throws Exception;
- void deleteBundles(Subject subject, int[] bundleIds);
+ /**
+ * @param subject must be InventoryManager
+ * @param BundleVersionId the BundleVersion being deployed by this definition
+ * @param name a name for this definition. not null or empty
+ * @param description an optional longer description describing this deploy def
+ * @param configuration a Configuration (pojo) to be associated with this deploy def. Although
+ * it is not enforceable
+ * must be that of the associated BundleVersion.
+ * @param enforcePolicy if true enforce policy on deployments made with this deploy def
+ * @param enforceInterval if enforcePolicy is true check policy at this interval (in seconds), otherwise ignored
+ * @param pinToBundle if true this deploy def is disabled if a newer BundleVersion is generated for the Bundle
+ * @return the persisted deploy definition
+ * @throws Exception
+ */
+ BundleDeployDefinition createBundleDeployDefinition( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleVersionid") int bundleVersionId, //
+ @WebParam(name = "name") String name, //
+ @WebParam(name = "description") String description, //
+ @WebParam(name = "configuration") Configuration configuration, //
+ @WebParam(name = "enforcePolicy") boolean enforcePolicy, //
+ @WebParam(name = "enforcementInterval") int enforcementInterval, //
+ @WebParam(name = "pinToBundle") boolean pinToBundle) throws Exception;
- void deleteBundleVersions(Subject subject, int[] bundleVersionIds);
+ /**
+ * @param subject must be InventoryManager
+ * @param bundleId the bundle for which this will be the next version
+ * @param name not null or empty
+ * @param bundleVersion optional. If not supplied set to 1.0 for first version, or incremented (as best as possible) for subsequent version
+ * @return the persisted BundleVersion (id is assigned)
+ */
+ BundleVersion createBundleVersion( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleId") int bundleId, //
+ @WebParam(name = "name") String name, //
+ @WebParam(name = "bundleVersion") String bundleVersion, //
+ @WebParam(name = "recipe") String recipe) throws Exception;
+
+ /**
+ * Remove everything associated with the Bundle with the exception of files laid down by related deployments.
+ * Deployed files are left as is on the deployment platforms but the bundle mechanism will no longer track
+ * the deployment.
+ *
+ * @param subject
+ * @param bundleId
+ * @throws Exception if any part of the removal fails.
+ */
+ @WebMethod
+ void deleteBundle( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleId") int bundleId) throws Exception;
+
+ @WebMethod
+ PageList<Bundle> findBundlesByCriteria( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "criteria") BundleCriteria criteria);
+
+ @WebMethod
+ PageList<BundleVersion> findBundleVersionsByCriteria( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "criteria") BundleVersionCriteria criteria);
+
+ @WebMethod
+ PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "criteria") BundleDeployDefinitionCriteria criteria);
+
+ @WebMethod
+ PageList<BundleDeployment> findBundleDeploymentsByCriteria( //
+ @WebParam(name = "subject") Subject subject, BundleDeploymentCriteria criteria);
@WebMethod
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(@WebParam(name = "subject") Subject subject,
+ // TODO is this necessary? Or do you just search for deployments and optionally fetch the history?
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(
+ //
+ @WebParam(name = "subject") Subject subject,
@WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
- PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
+ @WebMethod
+ List<BundleType> getAllBundleTypes( //
+ @WebParam(name = "subject") Subject subject);
+
+ /**
+ * Determine the files required for a BundleVersion and return all of the filenames or optionally, just those
+ * that lack BundleFiles for the BundleVersion. The recipe may be parsed as part of this call.
+ *
+ * @param subject must be InventoryManager
+ * @param bundleVersionId the BundleVersion being queried
+ * @param withoutBundleFileOnly if true omit any filenames that already have a corresponding BundleFile for
+ * the BundleVersion.
+ * @return The List of filenames.
+ * @throws Exception
+ */
+ Set<String> getBundleVersionFilenames( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleVersionId") int bundleVersionId, //
+ @WebParam(name = "withoutBundleFileOnly") boolean withoutBundleFileOnly) throws Exception;
/**
* Deploy the bundle as described in the provided deploy definition to the specified resource.
@@ -85,9 +229,10 @@ public interface BundleManagerRemote {
* @return the BundleScheduleResponse created to track the deployment.
* @throws Exception
*/
- BundleScheduleResponse scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
- throws Exception;
-
- void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
+ @WebMethod
+ BundleScheduleResponse scheduleBundleDeployment( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleDeployDefinitionId") int bundleDeployDefinitionId, //
+ @WebParam(name = "resourceId") int resourceId) throws Exception;
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 72298ca..49d51db 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -468,7 +468,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
history.setBundleDeployment(bundleDeployment);
- bundleManager.addBundleDeploymentHistoryByBundleDeployment(history);
+ bundleManager.addBundleDeploymentHistoryByBundleDeployment(overlord, history);
BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
List<BundleDeploymentHistory> histories = bundleManager.findBundleDeploymentHistoryByCriteria(overlord,
commit 0d8c741fb11e8aa0083cc177697561c7ecc75969
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 8 15:36:03 2010 +0100
Give the customContentForm an explicit name.
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/notif/customContent.xhtml b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/notif/customContent.xhtml
index e9c1ea2..0791c96 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/notif/customContent.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/notif/customContent.xhtml
@@ -20,10 +20,10 @@
<h:messages />
<c:if test="#{not empty customContentUIBean.contentUrl}">
- <h:form>
+ <h:form id="customContentForm">
<input type="hidden" name="senderName" value="#{param.senderName}" />
<input type="hidden" name="redirect" value="#{param.redirect}&nid=#{param.nid}" />
-
+
<h:messages showDetail="true"
globalOnly="true"
infoClass="InfoBlock"
commit 467eb72e60e0971180eebed5b6605dae69a18ab5
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 09:17:34 2010 -0500
BundleDeployment work
diff --git a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java
index a82e866..4226306 100644
--- a/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java
+++ b/modules/core/client-api/src/main/java/org/rhq/core/clientapi/agent/bundle/BundleScheduleResponse.java
@@ -25,6 +25,7 @@ package org.rhq.core.clientapi.agent.bundle;
import java.io.Serializable;
+import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.util.exception.ThrowableUtil;
/**
@@ -34,6 +35,7 @@ public class BundleScheduleResponse implements Serializable {
private static final long serialVersionUID = 1L;
private String errorMessage;
+ private BundleDeployment bundleDeployment;
public BundleScheduleResponse() {
}
@@ -54,6 +56,14 @@ public class BundleScheduleResponse implements Serializable {
this.errorMessage = ThrowableUtil.getAllMessages(t);
}
+ public BundleDeployment getBundleDeployment() {
+ return bundleDeployment;
+ }
+
+ public void setBundleDeployment(BundleDeployment bundleDeployment) {
+ this.bundleDeployment = bundleDeployment;
+ }
+
@Override
public String toString() {
StringBuilder str = new StringBuilder(this.getClass().getSimpleName());
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index fe55a02..1aaad05 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -20,7 +20,6 @@ package org.rhq.enterprise.server.bundle;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
-import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
@@ -29,6 +28,8 @@ import java.util.UUID;
import javax.ejb.EJB;
import javax.ejb.Stateless;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
@@ -36,6 +37,9 @@ import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.rhq.core.clientapi.agent.bundle.BundleAgentService;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleRequest;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUtility;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
@@ -63,11 +67,13 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.agentclient.AgentClient;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.content.ContentManagerLocal;
import org.rhq.enterprise.server.content.RepoManagerLocal;
+import org.rhq.enterprise.server.core.AgentManagerLocal;
import org.rhq.enterprise.server.plugin.pc.bundle.BundleServerPluginFacet;
import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
@@ -87,9 +93,15 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
private EntityManager entityManager;
@EJB
+ private AgentManagerLocal agentManager;
+
+ @EJB
private AuthorizationManagerLocal authorizationManager;
@EJB
+ private BundleManagerLocal bundleManager;
+
+ @EJB
private ContentManagerLocal contentManager;
@EJB
@@ -331,35 +343,51 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
- public List<BundleDeployment> deployBundle(Subject subject, int bundleDeployDefinitionId, int[] resourceIds)
+ public BundleScheduleResponse scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception {
- if (null == resourceIds || 0 == resourceIds.length) {
- throw new IllegalArgumentException("Invalid resourceIds: " + resourceIds);
+ BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
+ if (null == deployDef) {
+ throw new IllegalArgumentException("Invalid bundleDeployDefinitionId: " + bundleDeployDefinitionId);
+ }
+ Resource resource = (Resource) entityManager.find(Resource.class, resourceId);
+ if (null == resource) {
+ throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resourceId);
}
+ BundleDeployment deployment = bundleManager.createBundleDeployment(subject, bundleDeployDefinitionId,
+ resourceId);
+
+ AgentClient agentClient = agentManager.getAgentClient(resourceId);
+ BundleAgentService bundleAgentService = agentClient.getBundleAgentService();
+ BundleScheduleRequest request = new BundleScheduleRequest(deployDef);
+ BundleScheduleResponse response = bundleAgentService.schedule(request);
+ if (null != response) {
+ response.setBundleDeployment(deployment);
+ }
+
+ return response;
+ }
+
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
+ public BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
+ throws Exception {
+
BundleDeployDefinition deployDef = entityManager.find(BundleDeployDefinition.class, bundleDeployDefinitionId);
if (null == deployDef) {
throw new IllegalArgumentException("Invalid bundleDeployDefinitionId: " + bundleDeployDefinitionId);
}
- Resource[] resources = new Resource[resourceIds.length];
- for (int i = 0; (i < resourceIds.length); ++i) {
- resources[i] = (Resource) entityManager.find(Resource.class, resourceIds[i]);
- if (null == resources[i]) {
- throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resources[i]);
- }
+ Resource resource = (Resource) entityManager.find(Resource.class, resourceId);
+ if (null == resource) {
+ throw new IllegalArgumentException("Invalid resourceId (Resource does not exist): " + resourceId);
}
- List<BundleDeployment> result = new ArrayList<BundleDeployment>(resourceIds.length);
- // create a BundleDeploy record for each deployment
- for (Resource resource : resources) {
- BundleDeployment deployment = new BundleDeployment(deployDef, resource);
- deployDef.addDeployment(deployment);
- result.add(deployment);
- entityManager.persist(deployment);
- }
+ BundleDeployment deployment = new BundleDeployment(deployDef, resource);
+ deployDef.addDeployment(deployment);
+ entityManager.persist(deployment);
- return result;
+ return deployment;
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index aa8bf48..ba28693 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@ -26,7 +26,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -129,6 +129,13 @@ public interface BundleManagerLocal extends BundleManagerRemote {
throws Exception;
/**
+ * This is typically not called directly, typically deployBundle() is called externally. This executes
+ * in a New Transaction and supports deployBundle.
+ */
+ BundleDeployment createBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
+ throws Exception;
+
+ /**
* Determine the files required for a BundleVersion and return all of the filenames or optionally, just those
* that lack BundleFiles for the BundleVersion. The recipe may be parsed as part of this call.
*
@@ -142,7 +149,6 @@ public interface BundleManagerLocal extends BundleManagerRemote {
Set<String> getBundleVersionFilenames(Subject subject, int bundleVersionId, boolean withoutBundleFileOnly)
throws Exception;
-
//
// Methods shared with remote have been removed
// This interface now extends remote instead
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index bbbf310..11b024f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -26,6 +26,7 @@ import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
@@ -71,19 +72,20 @@ public interface BundleManagerRemote {
PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
-
/**
- * Immediately deploy the bundle as described in the provided deploy definition to the specified resources.
+ * Deploy the bundle as described in the provided deploy definition to the specified resource.
* Deployment is asynchronous so return of this method does not indicate deployments are complete. The
- * returned BundleDeployments can be used to track the history of the deployment.
+ * returned BundleDeployment can be used to track the history of the deployment.
+ *
+ * TODO: Add the scheduling capability, currently it's Immediate.
*
* @param subject must be InventoryManager
* @param bundleDeployDefinitionId the BundleDeployDefinition being used to guide the deployments
- * @param resourceIds the target resources (must exist), typically platforms, for the deployments
- * @return a List of BundleDeployments, one for each requested resource.
+ * @param resourceId the target resource (must exist), typically platforms, for the deployments
+ * @return the BundleScheduleResponse created to track the deployment.
* @throws Exception
*/
- List<BundleDeployment> deployBundle(Subject subject, int bundleDeployDefinitionId, int[] resourceIds)
+ BundleScheduleResponse scheduleBundleDeployment(Subject subject, int bundleDeployDefinitionId, int resourceId)
throws Exception;
void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index c2bb154..72298ca 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -29,10 +29,13 @@ import javax.persistence.Query;
import javax.transaction.TransactionManager;
import org.hibernate.LazyInitializationException;
+import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
@@ -51,6 +54,7 @@ import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
@@ -58,7 +62,9 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.resource.metadata.test.UpdateSubsytemTestBase;
+import org.rhq.enterprise.server.test.TestAgentClient;
+import org.rhq.enterprise.server.test.TestServerCommunicationsService;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -66,7 +72,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
*/
@SuppressWarnings( { "unchecked", "unused" })
@Test
-public class BundleManagerBeanTest extends AbstractEJB3Test {
+public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
private static final boolean TESTS_ENABLED = true;
@@ -80,6 +86,19 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
private TestBundleServerPluginService ps;
private MasterServerPluginContainer pc;
private Subject overlord;
+ TestServerCommunicationsService agentServiceContainer;
+
+ @Override
+ @BeforeClass
+ public void beforeClass() {
+ agentServiceContainer = prepareForTestAgents();
+ agentServiceContainer.bundleService = new TestAgentClient(null, new TestServerCommunicationsService());
+ }
+
+ @AfterClass
+ public void afterClass() throws Exception {
+ unprepareForTestAgents();
+ }
@BeforeMethod
public void beforeMethod() throws Exception {
@@ -192,6 +211,12 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
for (Object removeMe : doomed) {
em.remove(em.getReference(PackageType.class, ((PackageType) removeMe).getId()));
}
+ // remove Agents left over from test resources
+ q = em.createQuery("SELECT a FROM Agent a WHERE a.name LIKE '" + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(Agent.class, ((Agent) removeMe).getId()));
+ }
getTransactionManager().commit();
em.close();
@@ -285,12 +310,11 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
BundleDeployDefinition bdd1 = createDeployDefinition("one", bv1, config);
assertNotNull(bdd1);
Resource platformResource = createTestResource();
- List<BundleDeployment> bds = bundleManager.deployBundle(overlord, bdd1.getId(), new int[] { platformResource
- .getId() });
- assertNotNull(bds);
- assertEquals(1, bds.size());
- assertEquals(bdd1.getId(), bds.get(0).getBundleDeployDefinition().getId());
- assertEquals(platformResource.getId(), bds.get(0).getResource().getId());
+ BundleScheduleResponse bsr = bundleManager.scheduleBundleDeployment(overlord, bdd1.getId(), platformResource
+ .getId());
+ assertNotNull(bsr);
+ assertEquals(bdd1.getId(), bsr.getBundleDeployment().getBundleDeployDefinition().getId());
+ assertEquals(platformResource.getId(), bsr.getBundleDeployment().getResource().getId());
}
@Test(enabled = TESTS_ENABLED)
@@ -550,10 +574,14 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
"test", ResourceCategory.PLATFORM, null);
em.persist(resourceType);
+
+ Agent agent = new Agent(TEST_PREFIX + "-testagent", "testaddress", 1, "", "testtoken");
+ em.persist(agent);
em.flush();
resource = new Resource("reskey" + System.currentTimeMillis(), TEST_PREFIX + "-resname", resourceType);
resource.setInventoryStatus(InventoryStatus.COMMITTED);
+ resource.setAgent(agent);
em.persist(resource);
getTransactionManager().commit();
commit e666ce76ccc3ec298204852bdb4b506545780615
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 8 09:16:52 2010 -0500
Add BundleAgentService in appropriate places.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/AgentClient.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/AgentClient.java
index 13f71cf..d87b1db 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/AgentClient.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/AgentClient.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.agentclient;
+import org.rhq.core.clientapi.agent.bundle.BundleAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.content.ContentAgentService;
import org.rhq.core.clientapi.agent.discovery.DiscoveryAgentService;
@@ -66,6 +67,8 @@ public interface AgentClient {
*/
boolean ping(long timeoutMillis);
+ BundleAgentService getBundleAgentService();
+
ContentAgentService getContentAgentService();
ResourceFactoryAgentService getResourceFactoryAgentService();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
index f83e230..06c3175 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/agentclient/impl/AgentClientImpl.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.agentclient.impl;
+import org.rhq.core.clientapi.agent.bundle.BundleAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.content.ContentAgentService;
import org.rhq.core.clientapi.agent.discovery.DiscoveryAgentService;
@@ -124,6 +125,10 @@ public class AgentClientImpl implements AgentClient {
}
}
+ public BundleAgentService getBundleAgentService() {
+ return clientRemotePojoFactory.getRemotePojo(BundleAgentService.class);
+ }
+
public ContentAgentService getContentAgentService() {
return clientRemotePojoFactory.getRemotePojo(ContentAgentService.class);
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
index ebeda42..931ef0d 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestAgentClient.java
@@ -23,6 +23,9 @@ import java.util.List;
import java.util.Set;
import org.rhq.core.clientapi.agent.PluginContainerException;
+import org.rhq.core.clientapi.agent.bundle.BundleAgentService;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleRequest;
+import org.rhq.core.clientapi.agent.bundle.BundleScheduleResponse;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
import org.rhq.core.clientapi.agent.content.ContentAgentService;
@@ -59,9 +62,9 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.agentclient.AgentClient;
-public class TestAgentClient implements AgentClient, ContentAgentService, ResourceFactoryAgentService,
- ConfigurationAgentService, DiscoveryAgentService, MeasurementAgentService, OperationAgentService,
- SupportAgentService {
+public class TestAgentClient implements AgentClient, BundleAgentService, ContentAgentService,
+ ResourceFactoryAgentService, ConfigurationAgentService, DiscoveryAgentService, MeasurementAgentService,
+ OperationAgentService, SupportAgentService {
private final Agent agent;
private final TestServerCommunicationsService commService;
@@ -74,6 +77,10 @@ public class TestAgentClient implements AgentClient, ContentAgentService, Resour
return this.agent;
}
+ public BundleAgentService getBundleAgentService() {
+ return (commService.bundleService != null) ? commService.bundleService : this;
+ }
+
public ContentAgentService getContentAgentService() {
return (commService.contentService != null) ? commService.contentService : this;
}
@@ -256,7 +263,11 @@ public class TestAgentClient implements AgentClient, ContentAgentService, Resour
}
public Configuration validate(Configuration configuration, int resourceId, boolean isStructured)
- throws PluginContainerException {
+ throws PluginContainerException {
return null;
}
+
+ public BundleScheduleResponse schedule(BundleScheduleRequest request) {
+ return new BundleScheduleResponse();
+ }
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestServerCommunicationsService.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestServerCommunicationsService.java
index 72019a9..3995efb 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestServerCommunicationsService.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/TestServerCommunicationsService.java
@@ -26,6 +26,7 @@ import java.util.Properties;
import org.jboss.remoting.InvokerLocator;
+import org.rhq.core.clientapi.agent.bundle.BundleAgentService;
import org.rhq.core.clientapi.agent.configuration.ConfigurationAgentService;
import org.rhq.core.clientapi.agent.content.ContentAgentService;
import org.rhq.core.clientapi.agent.discovery.DiscoveryAgentService;
@@ -45,6 +46,7 @@ import org.rhq.enterprise.server.core.comm.ServerConfiguration;
* define what the test services should be.
*/
public class TestServerCommunicationsService implements TestServerCommunicationsServiceMBean {
+ public BundleAgentService bundleService;
public ContentAgentService contentService;
public ResourceFactoryAgentService resourceFactoryService;
public ConfigurationAgentService configurationService;
commit 52dac07976cd1a50e45e6de4a435cd2c5f012cb5
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Mar 4 16:26:50 2010 -0500
rebased and merged.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index ae472f4..c2bb154 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -121,7 +121,6 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
}
// remove bundleversions which cascade remove bundlefiles and bundledeploydefs
- // removal of bundledeploydefs cascade remove bundledeployments
q = em.createQuery("SELECT bv FROM BundleVersion bv WHERE bv.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
@@ -430,16 +429,15 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
assertNotNull(null);
}
- @Test(enabled = ENABLED)
+ @Test(enabled = DISABLED)
public void testFindHistoryByCriteria() throws Exception {
- Subject subject = getOverlord();
Long auditTime = new Date().getTime();
BundleDeploymentAction auditAction = BundleDeploymentAction.DEPLOYMENT_START;
String auditMessage = "This is my message";
BundleDeployment bundleDeployment = createDeployment();
- BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
+ BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, overlord.getName(), auditTime,
auditAction, auditMessage);
Bundle bundle = createBundle("deleteThisBundle");
@@ -449,8 +447,8 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
bundleManager.addBundleDeploymentHistoryByBundleDeployment(history);
BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
- List<BundleDeploymentHistory> histories = bundleManager
- .findBundleDeploymentHistoryByCriteria(subject, criteria);
+ List<BundleDeploymentHistory> histories = bundleManager.findBundleDeploymentHistoryByCriteria(overlord,
+ criteria);
assertNotNull(histories);
assertTrue(histories.size() > 0);
commit 087bc11206f795a3428debafeeda18c9436d4ed8
Merge: b6c0527... 5306afe...
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Mar 4 15:58:57 2010 -0500
Merge of changes from jshaughn.
diff --cc modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index b04efa0,1228fd1..fe55a02
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@@ -55,8 -55,8 +56,9 @@@ import org.rhq.core.domain.content.Repo
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
+ import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PersistenceUtility;
diff --cc modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index 11ca2bd,e7ea00e..aa8bf48
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@@ -148,38 -142,11 +142,10 @@@ public interface BundleManagerLocal ext
Set<String> getBundleVersionFilenames(Subject subject, int bundleVersionId, boolean withoutBundleFileOnly)
throws Exception;
- /**
- * Immediately deploy the bundle as described in the provided deploy definition to the specified resources.
- * Deployment is asynchronous so return of this method does not indicate deployments are complete. The
- * returned BundleDeployments can be used to track the history of the deployment.
- *
- * @param subject must be InventoryManager
- * @param bundleDeployDefinitionId the BundleDeployDefinition being used to guide the deployments
- * @param resourceIds the target resources (must exist), typically platforms, for the deployments
- * @return a List of BundleDeployments, one for each requested resource.
- * @throws Exception
- */
- List<BundleDeployment> deployBundle(Subject subject, int bundleDeployDefinitionId, int[] resourceIds)
- throws Exception;
- void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
- // The remaining methods are shared with the Remote Interface.
+ // Methods shared with remote have been removed
+ // This interface now extends remote instead
//
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
- BundleDeployDefinitionCriteria criteria);
-
- PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
-
- PageList<BundleVersion> findBundleVersionsByCriteria(Subject subject, BundleVersionCriteria criteria);
-
- PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria);
-
- List<BundleType> getAllBundleTypes(Subject subject);
-
- void deleteBundles(Subject subject, int[] bundleIds);
- void deleteBundleVersions(Subject subject, int[] bundleVersionIds);
}
diff --cc modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 09408b3,8d40500..bbbf310
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@@ -61,4 -64,11 +64,28 @@@ public interface BundleManagerRemote
void deleteBundles(Subject subject, int[] bundleIds);
void deleteBundleVersions(Subject subject, int[] bundleVersionIds);
+
+ @WebMethod
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(@WebParam(name = "subject") Subject subject,
+ @WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
+
+ PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
+
++
++ /**
++ * Immediately deploy the bundle as described in the provided deploy definition to the specified resources.
++ * Deployment is asynchronous so return of this method does not indicate deployments are complete. The
++ * returned BundleDeployments can be used to track the history of the deployment.
++ *
++ * @param subject must be InventoryManager
++ * @param bundleDeployDefinitionId the BundleDeployDefinition being used to guide the deployments
++ * @param resourceIds the target resources (must exist), typically platforms, for the deployments
++ * @return a List of BundleDeployments, one for each requested resource.
++ * @throws Exception
++ */
++ List<BundleDeployment> deployBundle(Subject subject, int bundleDeployDefinitionId, int[] resourceIds)
++ throws Exception;
++
++ void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
++
}
diff --cc modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index a860e42,f9525c4..ae472f4
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@@ -46,8 -49,8 +49,9 @@@ import org.rhq.core.domain.content.Pack
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
+ import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
@@@ -69,13 -71,16 +73,16 @@@ public class BundleManagerBeanTest exte
private static final String TEST_PREFIX = "bundletest";
private BundleManagerLocal bundleManager;
+ private ResourceManagerLocal resourceManager;
+ private static final boolean ENABLED = true;
+ private static final boolean DISABLED = false;
+
private TestBundleServerPluginService ps;
private MasterServerPluginContainer pc;
+ private Subject overlord;
@BeforeMethod
- public void beforeMethod() {
- // try and clean up any junk that may be lying around from a failed run
- cleanupDatabase();
+ public void beforeMethod() throws Exception {
this.ps = new TestBundleServerPluginService();
prepareCustomServerPluginService(this.ps);
@@@ -107,8 -109,13 +114,14 @@@
// clean up any tests that don't already clean up after themselves
+ q = em.createQuery("SELECT bdh FROM BundleDeploymentHistory bdh ");//WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
+ }
+
// remove bundleversions which cascade remove bundlefiles and bundledeploydefs
+ // removal of bundledeploydefs cascade remove bundledeployments
q = em.createQuery("SELECT bv FROM BundleVersion bv WHERE bv.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
commit 5306afe7b0787e0022c6ed1fa2b519e9c66e316c
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Mar 4 14:58:17 2010 -0500
REfactored interfaces and classes into smaller set of code.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
deleted file mode 100644
index 966e8f9..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.bundle;
-
-import java.util.List;
-
-import javax.ejb.EJB;
-import javax.ejb.Stateless;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
-import org.rhq.enterprise.server.RHQConstants;
-import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
-import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
-
-/**
- * Manages the creation and usage of bundles.
- *
- * @author Adam Young
- */
-@Stateless
-public class BundleDeploymentHistoryManagerBean implements BundleDeploymentHistoryManagerLocal,
- BundleDeploymentHistoryManagerRemote {
- private final Log log = LogFactory.getLog(this.getClass());
-
- @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
- private EntityManager entityManager;
-
- @EJB
- private AuthorizationManagerLocal authorizationManager;
-
- @EJB
- private ResourceTypeManagerLocal resourceTypeManager;
-
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
- BundleDeploymentHistoryCriteria criteria) {
-
- Query q = entityManager.createNamedQuery(BundleDeploymentHistory.QUERY_FIND_ALL);
- List<BundleDeploymentHistory> histories = (List<BundleDeploymentHistory>) q.getResultList();
- return histories;
- }
-
- public void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history)
- throws IllegalArgumentException {
-
- entityManager.persist(history);
-
- }
-}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
deleted file mode 100644
index 874c2d1..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.bundle;
-
-import javax.ejb.Local;
-
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
-
-/**
- * Local interface to the manager responsible for creating and managing bundles.
- *
- * @author Adam Young
- */
-@Local
-public interface BundleDeploymentHistoryManagerLocal extends BundleDeploymentHistoryManagerRemote {
-
- void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
-
-}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerRemote.java
deleted file mode 100644
index 657dc53..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerRemote.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.bundle;
-
-import java.util.List;
-
-import javax.ejb.Remote;
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebService;
-import javax.jws.soap.SOAPBinding;
-
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
-import org.rhq.enterprise.server.system.ServerVersion;
-
-/**
- * Remote interface to the manager responsible for creating and managing bundles deployment history.
- *
- * @author Adam Young
- */
-@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
-@WebService(targetNamespace = ServerVersion.namespace)
-@Remote
-public interface BundleDeploymentHistoryManagerRemote {
- @WebMethod
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(@WebParam(name = "subject") Subject subject,
- @WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
-
-}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index c9a3261..1228fd1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -41,6 +41,7 @@ import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -54,6 +55,7 @@ import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
@@ -488,4 +490,19 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
bundle = entityManager.merge(bundle);
return bundle;
}
+
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
+ BundleDeploymentHistoryCriteria criteria) {
+
+ Query q = entityManager.createNamedQuery(BundleDeploymentHistory.QUERY_FIND_ALL);
+ List<BundleDeploymentHistory> histories = (List<BundleDeploymentHistory>) q.getResultList();
+ return histories;
+ }
+
+ public void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history)
+ throws IllegalArgumentException {
+
+ entityManager.persist(history);
+
+ }
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
index 22880be..e7ea00e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerLocal.java
@@ -19,7 +19,6 @@
package org.rhq.enterprise.server.bundle;
import java.io.InputStream;
-import java.util.List;
import java.util.Set;
import javax.ejb.Local;
@@ -27,17 +26,12 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
-import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.content.Architecture;
-import org.rhq.core.domain.criteria.BundleCriteria;
-import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
-import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
-import org.rhq.core.domain.criteria.BundleVersionCriteria;
-import org.rhq.core.domain.util.PageList;
/**
* Local interface to the manager responsible for creating and managing bundles.
@@ -45,7 +39,7 @@ import org.rhq.core.domain.util.PageList;
* @author John Mazzitelli
*/
@Local
-public interface BundleManagerLocal {
+public interface BundleManagerLocal extends BundleManagerRemote {
/**
* Adds a BundleFile to the BundleVersion and implicitly creates the backing PackageVersion. If the PackageVersion
@@ -148,24 +142,11 @@ public interface BundleManagerLocal {
Set<String> getBundleVersionFilenames(Subject subject, int bundleVersionId, boolean withoutBundleFileOnly)
throws Exception;
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
+
//
- // The remaining methods are shared with the Remote Interface.
+ // Methods shared with remote have been removed
+ // This interface now extends remote instead
//
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
- PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
- BundleDeployDefinitionCriteria criteria);
-
- PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
-
- PageList<BundleVersion> findBundleVersionsByCriteria(Subject subject, BundleVersionCriteria criteria);
-
- PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria);
-
- List<BundleType> getAllBundleTypes(Subject subject);
-
- void deleteBundles(Subject subject, int[] bundleIds);
- void deleteBundleVersions(Subject subject, int[] bundleVersionIds);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 09408b3..8d40500 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -29,12 +29,15 @@ import javax.jws.soap.SOAPBinding;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeployDefinitionCriteria;
+import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
-import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.system.ServerVersion;
@@ -57,8 +60,15 @@ public interface BundleManagerRemote {
PageList<BundleDeployDefinition> findBundleDeployDefinitionsByCriteria(Subject subject,
BundleDeployDefinitionCriteria criteria);
-
+
void deleteBundles(Subject subject, int[] bundleIds);
void deleteBundleVersions(Subject subject, int[] bundleVersionIds);
+
+ @WebMethod
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(@WebParam(name = "subject") Subject subject,
+ @WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
+
+ PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
+
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java
index 85388bb..c21526a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java
@@ -55,8 +55,6 @@ import org.rhq.enterprise.server.authz.AuthorizationManagerBean;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.RoleManagerBean;
import org.rhq.enterprise.server.authz.RoleManagerLocal;
-import org.rhq.enterprise.server.bundle.BundleDeploymentHistoryManagerBean;
-import org.rhq.enterprise.server.bundle.BundleDeploymentHistoryManagerLocal;
import org.rhq.enterprise.server.bundle.BundleManagerBean;
import org.rhq.enterprise.server.bundle.BundleManagerLocal;
import org.rhq.enterprise.server.cloud.AffinityGroupManagerBean;
@@ -657,8 +655,4 @@ public final class LookupUtil {
return lookupLocal(DataAccessManagerBean.class);
}
- public static BundleDeploymentHistoryManagerLocal getBundleDeploymentHistoryManager() {
- return lookupLocal(BundleDeploymentHistoryManagerBean.class);
- }
-
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 508d40c..f9525c4 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -36,8 +36,6 @@ import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
-import org.rhq.core.domain.bundle.BundleFile;
-import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
@@ -71,7 +69,6 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
private static final boolean TESTS_ENABLED = true;
private static final String TEST_PREFIX = "bundletest";
- private BundleDeploymentHistoryManagerLocal bundleDeploymentHistoryManager;
private BundleManagerLocal bundleManager;
private static final boolean ENABLED = true;
@@ -88,7 +85,6 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
this.ps = new TestBundleServerPluginService();
prepareCustomServerPluginService(this.ps);
bundleManager = LookupUtil.getBundleManager();
- bundleDeploymentHistoryManager = LookupUtil.getBundleDeploymentHistoryManager();
this.ps.startMasterPluginContainer();
}
@@ -113,16 +109,11 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
// clean up any tests that don't already clean up after themselves
- /*
-
-
- q = em
- .createQuery("SELECT bdh FROM BundleDeploymentHistory bdh WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
+ q = em.createQuery("SELECT bdh FROM BundleDeploymentHistory bdh ");//WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
for (Object removeMe : doomed) {
em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
}
- */
// remove bundleversions which cascade remove bundlefiles and bundledeploydefs
q = em.createQuery("SELECT bv FROM BundleVersion bv WHERE bv.name LIKE '" + TEST_PREFIX + "%'");
@@ -409,10 +400,8 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
Long auditTime = new Date().getTime();
BundleDeploymentAction auditAction = BundleDeploymentAction.DEPLOYMENT_START;
String auditMessage = "This is my message";
- BundleDeployDefinition def = new BundleDeployDefinition();
- Resource resource = new Resource();
- BundleDeployment bundleDeployment = new BundleDeployment(def, resource);
+ BundleDeployment bundleDeployment = createDeployment();
BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
auditAction, auditMessage);
@@ -420,17 +409,25 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
history.setBundleDeployment(bundleDeployment);
- bundleDeploymentHistoryManager.addBundleDeploymentHistoryByBundleDeployment(history);
+ bundleManager.addBundleDeploymentHistoryByBundleDeployment(history);
BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
- List<BundleDeploymentHistory> histories = bundleDeploymentHistoryManager.findBundleDeploymentHistoryByCriteria(
- subject, criteria);
+ List<BundleDeploymentHistory> histories = bundleManager
+ .findBundleDeploymentHistoryByCriteria(subject, criteria);
assertNotNull(histories);
assertTrue(histories.size() > 0);
}
+ private BundleDeployment createDeployment() {
+ Resource resource = new Resource();
+
+ BundleDeployDefinition def = new BundleDeployDefinition();
+
+ return new BundleDeployment(def, resource);
+ }
+
private BundleType createBundleType(String name) throws Exception {
final String fullName = TEST_PREFIX + "-type-" + name;
ResourceType rt = createResourceType(name);
commit 93d41008cc0c42a858df64273d30f7efee35edfb
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Mar 4 11:38:22 2010 -0500
@Override was inappropriate here, and causing a compilation error in eclipse.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/RHQLTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/RHQLTest.java
index ceab3e3..e2f3fcb 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/RHQLTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/search/RHQLTest.java
@@ -59,7 +59,6 @@ public class RHQLTest extends AssertJUnit {
this.line = line;
}
- @Override
public TestResult call() throws Exception {
try {
System.out.println(line);
commit 180fe468f6d5de8e1a910ad63666be2e44c42012
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Mar 3 21:17:42 2010 -0500
minor work on the test, checking in order to rebase.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
deleted file mode 100644
index 53efe6f..0000000
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2009 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-package org.rhq.enterprise.server.bundle;
-
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import org.rhq.enterprise.server.content.RepoManagerLocal;
-import org.rhq.enterprise.server.test.AbstractEJB3Test;
-import org.rhq.enterprise.server.util.LookupUtil;
-
-/**
- * @author Adam Young
- */
-@SuppressWarnings( { "unchecked", "unused" })
-@Test
-public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
-
- private static final String TEST_PREFIX = "bundledeploymenthistorytest";
-
- private static final boolean ENABLED = true;
- private static final boolean DISABLED = false;
-
- private BundleDeploymentHistoryManagerLocal bundleDeploymentHistoryManager;
- private BundleManagerLocal bundleManagerBean;
-
- private RepoManagerLocal repoManager;
-
- @BeforeMethod
- public void beforeMethod() {
- bundleDeploymentHistoryManager = LookupUtil.getBundleDeploymentHistoryManager();
- bundleManagerBean = LookupUtil.getBundleManager();
- repoManager = LookupUtil.getRepoManagerLocal();
- }
-
- @AfterMethod(alwaysRun = true)
- public void afterMethod() {
-
- EntityManager em = null;
-
- try {
- getTransactionManager().begin();
- em = getEntityManager();
-
- Query q;
- List doomed;
-
- // clean up any tests that don't already clean up after themselves
-
- getTransactionManager().commit();
- em.close();
- em = null;
- } catch (Exception e) {
- try {
- System.out.println("CANNOT CLEAN UP TEST: Cause: " + e);
- getTransactionManager().rollback();
- } catch (Exception ignore) {
- }
- } finally {
- if (null != em) {
- em.close();
- }
- }
- }
-
-}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 3e0eadf..508d40c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -41,6 +41,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleFile;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.configuration.Configuration;
@@ -76,7 +77,6 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
private static final boolean ENABLED = true;
private static final boolean DISABLED = false;
-
private TestBundleServerPluginService ps;
private MasterServerPluginContainer pc;
@@ -113,6 +113,17 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
// clean up any tests that don't already clean up after themselves
+ /*
+
+
+ q = em
+ .createQuery("SELECT bdh FROM BundleDeploymentHistory bdh WHERE bdh.name LIKE '" + TEST_PREFIX + "%'");
+ doomed = q.getResultList();
+ for (Object removeMe : doomed) {
+ em.remove(em.getReference(BundleDeploymentHistory.class, ((BundleDeploymentHistory) removeMe).getId()));
+ }
+ */
+
// remove bundleversions which cascade remove bundlefiles and bundledeploydefs
q = em.createQuery("SELECT bv FROM BundleVersion bv WHERE bv.name LIKE '" + TEST_PREFIX + "%'");
doomed = q.getResultList();
@@ -392,7 +403,7 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
}
@Test(enabled = ENABLED)
- public void testFindByCriteria() throws Exception {
+ public void testFindHistoryByCriteria() throws Exception {
Subject subject = getOverlord();
Long auditTime = new Date().getTime();
@@ -400,6 +411,7 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
String auditMessage = "This is my message";
BundleDeployDefinition def = new BundleDeployDefinition();
Resource resource = new Resource();
+
BundleDeployment bundleDeployment = new BundleDeployment(def, resource);
BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
auditAction, auditMessage);
commit 406d4c2f89938173a39519be132bda3fd38b02dc
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Mar 3 12:41:29 2010 -0500
Slowly merging the history work in with the rest of the bundle implementation. First, the test case
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
index 1bab40c..53efe6f 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
@@ -5,7 +5,7 @@
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
+ * the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,29 +19,15 @@
package org.rhq.enterprise.server.bundle;
-import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
-import javax.transaction.TransactionManager;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.bundle.Bundle;
-import org.rhq.core.domain.bundle.BundleDeployDefinition;
-import org.rhq.core.domain.bundle.BundleDeployment;
-import org.rhq.core.domain.bundle.BundleDeploymentAction;
-import org.rhq.core.domain.bundle.BundleDeploymentHistory;
-import org.rhq.core.domain.bundle.BundleType;
-import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceCategory;
-import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -100,104 +86,4 @@ public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
}
}
- @Test(enabled = DISABLED)
- public void testInsertAndRetrieve() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = DISABLED)
- public void testFindByPlatformId() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = DISABLED)
- public void testFindByBundleId() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = DISABLED)
- public void testFindByBundleDeploymentId() throws Exception {
- assertNotNull(null);
- }
-
- @Test(enabled = ENABLED)
- public void testFindByCriteria() throws Exception {
-
- Subject subject = getOverlord();
- Long auditTime = new Date().getTime();
- BundleDeploymentAction auditAction = BundleDeploymentAction.DEPLOYMENT_START;
- String auditMessage = "This is my message";
- BundleDeployDefinition def = new BundleDeployDefinition();
- Resource resource = new Resource();
- BundleDeployment bundleDeployment = new BundleDeployment(def, resource);
- BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
- auditAction, auditMessage);
-
- Bundle bundle = createBundle("deleteThisBundle");
-
- history.setBundleDeployment(bundleDeployment);
-
- bundleDeploymentHistoryManager.addBundleDeploymentHistoryByBundleDeployment(history);
-
- BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
- List<BundleDeploymentHistory> histories = bundleDeploymentHistoryManager.findBundleDeploymentHistoryByCriteria(
- subject, criteria);
-
- assertNotNull(histories);
- assertTrue(histories.size() > 0);
-
- }
-
- private BundleType createBundleType(String name) throws Exception {
- final String fullName = TEST_PREFIX + "-type-" + name;
- BundleType bt = new BundleType(fullName, createResourceType(name));
- bt = bundleManagerBean.createBundleType(getOverlord(), bt);
-
- assert bt.getId() > 0;
- assert bt.getName().endsWith(fullName);
- return bt;
- }
-
- private Bundle createBundle(String name) throws Exception {
- BundleType bt = createBundleType(name);
- return createBundle(name, bt);
- }
-
- private Bundle createBundle(String name, BundleType bt) throws Exception {
- final String fullName = TEST_PREFIX + "-bundle-" + name;
- Bundle b = new Bundle(fullName, bt);
- b = bundleManagerBean.createBundle(getOverlord(), b);
-
- assert b.getId() > 0;
- assert b.getName().endsWith(fullName);
- return b;
- }
-
- private BundleVersion createBundleVersion(String name, String version, Bundle bundle) throws Exception {
- final String fullName = TEST_PREFIX + "-version-" + version + "-" + name;
- final String recipe = TEST_PREFIX + "-recipe-" + name;
- BundleVersion bv = new BundleVersion(fullName, version, bundle, recipe);
- bv = bundleManagerBean.createBundleVersion(getOverlord(), bv);
-
- assert bv.getId() > 0;
- assert bv.getName().endsWith(fullName);
- return bv;
- }
-
- private ResourceType createResourceType(String name) throws Exception {
- final String fullName = TEST_PREFIX + "-resourcetype-" + name;
- ResourceType rt = new ResourceType(fullName, "BundleManagerBeanTest", ResourceCategory.PLATFORM, null);
-
- TransactionManager txMgr = getTransactionManager();
- txMgr.begin();
- EntityManager em = getEntityManager();
- em.persist(rt);
- em.close();
- txMgr.commit();
- return rt;
- }
-
- private Subject getOverlord() {
- return LookupUtil.getSubjectManager().getOverlord();
- }
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index 45e946f..3e0eadf 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -20,6 +20,7 @@
package org.rhq.enterprise.server.bundle;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Set;
@@ -36,6 +37,10 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentAction;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.configuration.Configuration;
@@ -45,7 +50,9 @@ import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
@@ -63,8 +70,12 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
private static final boolean TESTS_ENABLED = true;
private static final String TEST_PREFIX = "bundletest";
+ private BundleDeploymentHistoryManagerLocal bundleDeploymentHistoryManager;
private BundleManagerLocal bundleManager;
+ private static final boolean ENABLED = true;
+ private static final boolean DISABLED = false;
+
private TestBundleServerPluginService ps;
private MasterServerPluginContainer pc;
@@ -77,6 +88,7 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
this.ps = new TestBundleServerPluginService();
prepareCustomServerPluginService(this.ps);
bundleManager = LookupUtil.getBundleManager();
+ bundleDeploymentHistoryManager = LookupUtil.getBundleDeploymentHistoryManager();
this.ps.startMasterPluginContainer();
}
@@ -359,6 +371,54 @@ public class BundleManagerBeanTest extends AbstractEJB3Test {
assertTrue(bv.getBundleDeployDefinitions().isEmpty());
}
+ @Test(enabled = DISABLED)
+ public void testInsertAndRetrieve() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = DISABLED)
+ public void testFindByPlatformId() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = DISABLED)
+ public void testFindByBundleId() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = DISABLED)
+ public void testFindByBundleDeploymentId() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = ENABLED)
+ public void testFindByCriteria() throws Exception {
+
+ Subject subject = getOverlord();
+ Long auditTime = new Date().getTime();
+ BundleDeploymentAction auditAction = BundleDeploymentAction.DEPLOYMENT_START;
+ String auditMessage = "This is my message";
+ BundleDeployDefinition def = new BundleDeployDefinition();
+ Resource resource = new Resource();
+ BundleDeployment bundleDeployment = new BundleDeployment(def, resource);
+ BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
+ auditAction, auditMessage);
+
+ Bundle bundle = createBundle("deleteThisBundle");
+
+ history.setBundleDeployment(bundleDeployment);
+
+ bundleDeploymentHistoryManager.addBundleDeploymentHistoryByBundleDeployment(history);
+
+ BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
+ List<BundleDeploymentHistory> histories = bundleDeploymentHistoryManager.findBundleDeploymentHistoryByCriteria(
+ subject, criteria);
+
+ assertNotNull(histories);
+ assertTrue(histories.size() > 0);
+
+ }
+
private BundleType createBundleType(String name) throws Exception {
final String fullName = TEST_PREFIX + "-type-" + name;
ResourceType rt = createResourceType(name);
commit ff3f5eaa64b5b6dac00d1e1846bfb541c8b79c3c
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Mar 3 12:12:08 2010 -0500
Adding persistance to the Session Bean calls, and testing it.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
index 4033881..a1f370c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
@@ -34,6 +34,8 @@ import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlAccessType;
@@ -45,12 +47,16 @@ import javax.xml.bind.annotation.XmlAccessorType;
* @author Jay Shaughnessy
*/
@Entity
+@NamedQueries( { @NamedQuery(name = BundleDeploymentHistory.QUERY_FIND_ALL, query = "SELECT bdh FROM BundleDeploymentHistory bdh") //
+})
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_BUNDLE_DEPLOY_HIST_ID_SEQ")
@Table(name = "RHQ_BUNDLE_DEPLOY_HIST")
@XmlAccessorType(XmlAccessType.FIELD)
public class BundleDeploymentHistory implements Serializable {
private static final long serialVersionUID = 1L;
+ public static final String QUERY_FIND_ALL = "BundleDeploymentHistory.findAll";
+
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ")
@Id
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
index c16c5e4..966e8f9 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
@@ -18,13 +18,13 @@
*/
package org.rhq.enterprise.server.bundle;
-import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -57,12 +57,16 @@ public class BundleDeploymentHistoryManagerBean implements BundleDeploymentHisto
public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
BundleDeploymentHistoryCriteria criteria) {
- List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
+
+ Query q = entityManager.createNamedQuery(BundleDeploymentHistory.QUERY_FIND_ALL);
+ List<BundleDeploymentHistory> histories = (List<BundleDeploymentHistory>) q.getResultList();
return histories;
}
public void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history)
throws IllegalArgumentException {
+ entityManager.persist(history);
+
}
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
index c8a2264..1bab40c 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
@@ -24,18 +24,25 @@ import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
+import javax.transaction.TransactionManager;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentAction;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.bundle.BundleType;
+import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceCategory;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.test.AbstractEJB3Test;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -49,12 +56,18 @@ public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
private static final String TEST_PREFIX = "bundledeploymenthistorytest";
private static final boolean ENABLED = true;
+ private static final boolean DISABLED = false;
private BundleDeploymentHistoryManagerLocal bundleDeploymentHistoryManager;
+ private BundleManagerLocal bundleManagerBean;
+
+ private RepoManagerLocal repoManager;
@BeforeMethod
public void beforeMethod() {
bundleDeploymentHistoryManager = LookupUtil.getBundleDeploymentHistoryManager();
+ bundleManagerBean = LookupUtil.getBundleManager();
+ repoManager = LookupUtil.getRepoManagerLocal();
}
@AfterMethod(alwaysRun = true)
@@ -87,17 +100,22 @@ public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
}
}
- @Test(enabled = ENABLED)
+ @Test(enabled = DISABLED)
+ public void testInsertAndRetrieve() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = DISABLED)
public void testFindByPlatformId() throws Exception {
assertNotNull(null);
}
- @Test(enabled = ENABLED)
+ @Test(enabled = DISABLED)
public void testFindByBundleId() throws Exception {
assertNotNull(null);
}
- @Test(enabled = ENABLED)
+ @Test(enabled = DISABLED)
public void testFindByBundleDeploymentId() throws Exception {
assertNotNull(null);
}
@@ -115,6 +133,10 @@ public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
auditAction, auditMessage);
+ Bundle bundle = createBundle("deleteThisBundle");
+
+ history.setBundleDeployment(bundleDeployment);
+
bundleDeploymentHistoryManager.addBundleDeploymentHistoryByBundleDeployment(history);
BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
@@ -126,6 +148,55 @@ public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
}
+ private BundleType createBundleType(String name) throws Exception {
+ final String fullName = TEST_PREFIX + "-type-" + name;
+ BundleType bt = new BundleType(fullName, createResourceType(name));
+ bt = bundleManagerBean.createBundleType(getOverlord(), bt);
+
+ assert bt.getId() > 0;
+ assert bt.getName().endsWith(fullName);
+ return bt;
+ }
+
+ private Bundle createBundle(String name) throws Exception {
+ BundleType bt = createBundleType(name);
+ return createBundle(name, bt);
+ }
+
+ private Bundle createBundle(String name, BundleType bt) throws Exception {
+ final String fullName = TEST_PREFIX + "-bundle-" + name;
+ Bundle b = new Bundle(fullName, bt);
+ b = bundleManagerBean.createBundle(getOverlord(), b);
+
+ assert b.getId() > 0;
+ assert b.getName().endsWith(fullName);
+ return b;
+ }
+
+ private BundleVersion createBundleVersion(String name, String version, Bundle bundle) throws Exception {
+ final String fullName = TEST_PREFIX + "-version-" + version + "-" + name;
+ final String recipe = TEST_PREFIX + "-recipe-" + name;
+ BundleVersion bv = new BundleVersion(fullName, version, bundle, recipe);
+ bv = bundleManagerBean.createBundleVersion(getOverlord(), bv);
+
+ assert bv.getId() > 0;
+ assert bv.getName().endsWith(fullName);
+ return bv;
+ }
+
+ private ResourceType createResourceType(String name) throws Exception {
+ final String fullName = TEST_PREFIX + "-resourcetype-" + name;
+ ResourceType rt = new ResourceType(fullName, "BundleManagerBeanTest", ResourceCategory.PLATFORM, null);
+
+ TransactionManager txMgr = getTransactionManager();
+ txMgr.begin();
+ EntityManager em = getEntityManager();
+ em.persist(rt);
+ em.close();
+ txMgr.commit();
+ return rt;
+ }
+
private Subject getOverlord() {
return LookupUtil.getSubjectManager().getOverlord();
}
commit e73459655da47089d9aa935e0e642110962cdd5b
Author: Adam Young <ayoung(a)redhat.com>
Date: Thu Feb 25 12:41:42 2010 -0500
Made jmarques changes, starting to sketch out the criteria object.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistoryAction.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistoryAction.java
deleted file mode 100644
index 2a8756a..0000000
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistoryAction.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.rhq.core.domain.bundle;
-
-public enum BundleDeploymentHistoryAction {
- A, B, C
-}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
index 4be0988..a459be5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
@@ -34,12 +34,36 @@ public class BundleDeploymentHistoryCriteria extends Criteria {
private static final long serialVersionUID = 747793536546442610L;
+ //No reason to make these private. The setters are necessary to work with bean-api mechanisms
+ public Integer filterId;
+ public Integer filterPlatformResourceId;
+ public Integer filterBundleId;
+ public Integer filterBundleDeploymentId;
+ public Integer filterBundleDeploymentDefinitionId;
+
public BundleDeploymentHistoryCriteria() {
super(BundleDeploymentHistory.class);
}
- public void addFilterId(Integer filterId) {
+ public void setFilterId(Integer filterId) {
+ this.filterId = filterId;
+ }
+
+ public void setFilterPlatformResourceId(Integer filterPlatformResourceId) {
+ this.filterPlatformResourceId = filterPlatformResourceId;
+ }
+
+ public void setFilterBundleId(Integer filterBundleId) {
+ this.filterBundleId = filterBundleId;
+ }
+
+ public void setFilterBundleDeploymentId(Integer filterBundleDeploymentId) {
+ this.filterBundleDeploymentId = filterBundleDeploymentId;
+ }
+
+ public void setFilterBundleDeploymentDefinitionId(Integer filterBundleDeploymentDefinitionId) {
+ this.filterBundleDeploymentDefinitionId = filterBundleDeploymentDefinitionId;
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
index 95d0c86..c16c5e4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
@@ -30,7 +30,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
import org.rhq.enterprise.server.RHQConstants;
@@ -56,39 +55,6 @@ public class BundleDeploymentHistoryManagerBean implements BundleDeploymentHisto
@EJB
private ResourceTypeManagerLocal resourceTypeManager;
- /**
- *
- * @param bundleDeployment
- * @return
- */
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleDeployment(BundleDeployment bundleDeployment) {
- List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
- return histories;
- }
-
- /**
- * gets history for a specific bundle deployment
- * @param bundleId
- * @param platformResourceId
- * @return
- */
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleAndPlatform(int bundleId,
- int platformResourceId) {
- List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
- return histories;
- }
-
- /**
- *
- * @param platformResourceId
- * @return
- */
- public List<BundleDeploymentHistory> findBundleDeploymentHistoryByPlatform(int platformResourceId) {
- List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
- return histories;
-
- }
-
public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
BundleDeploymentHistoryCriteria criteria) {
List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
@@ -97,7 +63,6 @@ public class BundleDeploymentHistoryManagerBean implements BundleDeploymentHisto
public void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history)
throws IllegalArgumentException {
- // TODO Auto-generated method stub
}
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
index 4dd4b3b..874c2d1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
@@ -18,32 +18,18 @@
*/
package org.rhq.enterprise.server.bundle;
-import java.util.List;
-
import javax.ejb.Local;
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentHistory;
-import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
/**
* Local interface to the manager responsible for creating and managing bundles.
*
- * @author Adam YOung
+ * @author Adam Young
*/
@Local
-public interface BundleDeploymentHistoryManagerLocal {
+public interface BundleDeploymentHistoryManagerLocal extends BundleDeploymentHistoryManagerRemote {
void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleDeployment(BundleDeployment bundleDeployment);
-
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleAndPlatform(int bundleId, int platformResourceId);
-
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByPlatform(int platformResourceId);
-
- List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
- BundleDeploymentHistoryCriteria criteria);
-
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
index 7321a52..c8a2264 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
@@ -88,6 +88,21 @@ public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
}
@Test(enabled = ENABLED)
+ public void testFindByPlatformId() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = ENABLED)
+ public void testFindByBundleId() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = ENABLED)
+ public void testFindByBundleDeploymentId() throws Exception {
+ assertNotNull(null);
+ }
+
+ @Test(enabled = ENABLED)
public void testFindByCriteria() throws Exception {
Subject subject = getOverlord();
commit 0e4d137c615e702ec7accef05d6922eb36f07dc2
Author: Adam Young <ayoung(a)redhat.com>
Date: Wed Feb 24 20:44:03 2010 -0500
Skeleton of the BundleDeploymnetHistory API
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
index ac14d5f..4033881 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistory.java
@@ -68,7 +68,7 @@ public class BundleDeploymentHistory implements Serializable {
@Column(name = "AUDIT_ACTION", nullable = false)
@Enumerated(EnumType.STRING)
- private BundleDeploymentHistory auditAction;
+ private BundleDeploymentAction auditAction;
@Column(name = "AUDIT_MESSAGE", nullable = true)
private String auditMessage;
@@ -78,7 +78,7 @@ public class BundleDeploymentHistory implements Serializable {
}
public BundleDeploymentHistory(BundleDeployment bundleDeployment, String subjectName, Long auditTime,
- BundleDeploymentHistory auditAction, String auditMessage) {
+ BundleDeploymentAction auditAction, String auditMessage) {
this.bundleDeployment = bundleDeployment;
this.subjectName = subjectName;
@@ -119,11 +119,11 @@ public class BundleDeploymentHistory implements Serializable {
this.auditTime = auditTime;
}
- public BundleDeploymentHistory getAuditAction() {
+ public BundleDeploymentAction getAuditAction() {
return auditAction;
}
- public void setAuditAction(BundleDeploymentHistory auditAction) {
+ public void setAuditAction(BundleDeploymentAction auditAction) {
this.auditAction = auditAction;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistoryAction.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistoryAction.java
new file mode 100644
index 0000000..2a8756a
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleDeploymentHistoryAction.java
@@ -0,0 +1,5 @@
+package org.rhq.core.domain.bundle;
+
+public enum BundleDeploymentHistoryAction {
+ A, B, C
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
new file mode 100644
index 0000000..4be0988
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentHistoryCriteria.java
@@ -0,0 +1,45 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.criteria;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+
+/**
+ * @author Adam Young
+ */
+@XmlRootElement
+(a)XmlAccessorType(XmlAccessType.FIELD)
+public class BundleDeploymentHistoryCriteria extends Criteria {
+
+ private static final long serialVersionUID = 747793536546442610L;
+
+ public BundleDeploymentHistoryCriteria() {
+ super(BundleDeploymentHistory.class);
+
+ }
+
+ public void addFilterId(Integer filterId) {
+ }
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
new file mode 100644
index 0000000..95d0c86
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBean.java
@@ -0,0 +1,103 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.bundle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.EJB;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+
+/**
+ * Manages the creation and usage of bundles.
+ *
+ * @author Adam Young
+ */
+@Stateless
+public class BundleDeploymentHistoryManagerBean implements BundleDeploymentHistoryManagerLocal,
+ BundleDeploymentHistoryManagerRemote {
+ private final Log log = LogFactory.getLog(this.getClass());
+
+ @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
+ private EntityManager entityManager;
+
+ @EJB
+ private AuthorizationManagerLocal authorizationManager;
+
+ @EJB
+ private ResourceTypeManagerLocal resourceTypeManager;
+
+ /**
+ *
+ * @param bundleDeployment
+ * @return
+ */
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleDeployment(BundleDeployment bundleDeployment) {
+ List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
+ return histories;
+ }
+
+ /**
+ * gets history for a specific bundle deployment
+ * @param bundleId
+ * @param platformResourceId
+ * @return
+ */
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleAndPlatform(int bundleId,
+ int platformResourceId) {
+ List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
+ return histories;
+ }
+
+ /**
+ *
+ * @param platformResourceId
+ * @return
+ */
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByPlatform(int platformResourceId) {
+ List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
+ return histories;
+
+ }
+
+ public List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
+ BundleDeploymentHistoryCriteria criteria) {
+ List<BundleDeploymentHistory> histories = new ArrayList<BundleDeploymentHistory>();
+ return histories;
+ }
+
+ public void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history)
+ throws IllegalArgumentException {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
new file mode 100644
index 0000000..4dd4b3b
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerLocal.java
@@ -0,0 +1,49 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.bundle;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+
+/**
+ * Local interface to the manager responsible for creating and managing bundles.
+ *
+ * @author Adam YOung
+ */
+@Local
+public interface BundleDeploymentHistoryManagerLocal {
+
+ void addBundleDeploymentHistoryByBundleDeployment(BundleDeploymentHistory history) throws IllegalArgumentException;
+
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleDeployment(BundleDeployment bundleDeployment);
+
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByBundleAndPlatform(int bundleId, int platformResourceId);
+
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByPlatform(int platformResourceId);
+
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(Subject subject,
+ BundleDeploymentHistoryCriteria criteria);
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerRemote.java
new file mode 100644
index 0000000..657dc53
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerRemote.java
@@ -0,0 +1,47 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.bundle;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+import org.rhq.enterprise.server.system.ServerVersion;
+
+/**
+ * Remote interface to the manager responsible for creating and managing bundles deployment history.
+ *
+ * @author Adam Young
+ */
+@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
+@WebService(targetNamespace = ServerVersion.namespace)
+@Remote
+public interface BundleDeploymentHistoryManagerRemote {
+ @WebMethod
+ List<BundleDeploymentHistory> findBundleDeploymentHistoryByCriteria(@WebParam(name = "subject") Subject subject,
+ @WebParam(name = "criteria") BundleDeploymentHistoryCriteria criteria);
+
+}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java
index c21526a..85388bb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/LookupUtil.java
@@ -55,6 +55,8 @@ import org.rhq.enterprise.server.authz.AuthorizationManagerBean;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.RoleManagerBean;
import org.rhq.enterprise.server.authz.RoleManagerLocal;
+import org.rhq.enterprise.server.bundle.BundleDeploymentHistoryManagerBean;
+import org.rhq.enterprise.server.bundle.BundleDeploymentHistoryManagerLocal;
import org.rhq.enterprise.server.bundle.BundleManagerBean;
import org.rhq.enterprise.server.bundle.BundleManagerLocal;
import org.rhq.enterprise.server.cloud.AffinityGroupManagerBean;
@@ -655,4 +657,8 @@ public final class LookupUtil {
return lookupLocal(DataAccessManagerBean.class);
}
+ public static BundleDeploymentHistoryManagerLocal getBundleDeploymentHistoryManager() {
+ return lookupLocal(BundleDeploymentHistoryManagerBean.class);
+ }
+
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
new file mode 100644
index 0000000..7321a52
--- /dev/null
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleDeploymentHistoryManagerBeanTest.java
@@ -0,0 +1,117 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.enterprise.server.bundle;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.bundle.BundleDeployDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleDeploymentAction;
+import org.rhq.core.domain.bundle.BundleDeploymentHistory;
+import org.rhq.core.domain.criteria.BundleDeploymentHistoryCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.server.test.AbstractEJB3Test;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * @author Adam Young
+ */
+@SuppressWarnings( { "unchecked", "unused" })
+@Test
+public class BundleDeploymentHistoryManagerBeanTest extends AbstractEJB3Test {
+
+ private static final String TEST_PREFIX = "bundledeploymenthistorytest";
+
+ private static final boolean ENABLED = true;
+
+ private BundleDeploymentHistoryManagerLocal bundleDeploymentHistoryManager;
+
+ @BeforeMethod
+ public void beforeMethod() {
+ bundleDeploymentHistoryManager = LookupUtil.getBundleDeploymentHistoryManager();
+ }
+
+ @AfterMethod(alwaysRun = true)
+ public void afterMethod() {
+
+ EntityManager em = null;
+
+ try {
+ getTransactionManager().begin();
+ em = getEntityManager();
+
+ Query q;
+ List doomed;
+
+ // clean up any tests that don't already clean up after themselves
+
+ getTransactionManager().commit();
+ em.close();
+ em = null;
+ } catch (Exception e) {
+ try {
+ System.out.println("CANNOT CLEAN UP TEST: Cause: " + e);
+ getTransactionManager().rollback();
+ } catch (Exception ignore) {
+ }
+ } finally {
+ if (null != em) {
+ em.close();
+ }
+ }
+ }
+
+ @Test(enabled = ENABLED)
+ public void testFindByCriteria() throws Exception {
+
+ Subject subject = getOverlord();
+ Long auditTime = new Date().getTime();
+ BundleDeploymentAction auditAction = BundleDeploymentAction.DEPLOYMENT_START;
+ String auditMessage = "This is my message";
+ BundleDeployDefinition def = new BundleDeployDefinition();
+ Resource resource = new Resource();
+ BundleDeployment bundleDeployment = new BundleDeployment(def, resource);
+ BundleDeploymentHistory history = new BundleDeploymentHistory(bundleDeployment, subject.getName(), auditTime,
+ auditAction, auditMessage);
+
+ bundleDeploymentHistoryManager.addBundleDeploymentHistoryByBundleDeployment(history);
+
+ BundleDeploymentHistoryCriteria criteria = new BundleDeploymentHistoryCriteria();
+ List<BundleDeploymentHistory> histories = bundleDeploymentHistoryManager.findBundleDeploymentHistoryByCriteria(
+ subject, criteria);
+
+ assertNotNull(histories);
+ assertTrue(histories.size() > 0);
+
+ }
+
+ private Subject getOverlord() {
+ return LookupUtil.getSubjectManager().getOverlord();
+ }
+}
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.
14 years, 1 month
[rhq] Branch 'gwt' - 2 commits - modules/common modules/core
by mazz
modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java | 42 +++++++---
modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java | 10 ++
modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java | 6 -
3 files changed, 41 insertions(+), 17 deletions(-)
New commits:
commit ab83afe6697b693ecf22ce16e3c05ed3f6ac694f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 12:17:17 2010 -0400
explicitly support some standard java sysprops
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index c997d57..6ec0dd9 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -129,29 +129,51 @@ public class RecipeParserTest {
}
public void testSimpleRecipeReplaceJavaSystemPropertyReplacementVariables() throws Exception {
- addRecipeCommand("deploy -f jboss1.tar -d <%java.io.tmpdir%>");
- addRecipeCommand("deploy -f jboss2.tar -d <%custom.sysprop%>");
+ /*
+ java.util.Properties sysprops = System.getProperties();
+ for (Map.Entry<Object, Object> sysprop : sysprops.entrySet()) {
+ if (sysprop.getValue().toString().length() < 60) {
+ System.out.println("==>" + sysprop.getKey() + "=" + sysprop.getValue());
+ }
+ }
+ */
+
+ addRecipeCommand("deploy -f jboss1.tar -d <%rhq.system.sysprop.java.io.tmpdir%>");
+ addRecipeCommand("deploy -f jboss2.tar -d <%rhq.system.sysprop.file.separator%>");
+ //addRecipeCommand("deploy -f jboss3.tar -d <%rhq.system.sysprop.line.separator%>"); // can't test this here
+ addRecipeCommand("deploy -f jboss4.tar -d <%rhq.system.sysprop.path.separator%>");
+ addRecipeCommand("deploy -f jboss5.tar -d <%rhq.system.sysprop.java.home%>");
+ addRecipeCommand("deploy -f jboss6.tar -d <%rhq.system.sysprop.java.version%>");
+ //addRecipeCommand("deploy -f jboss7.tar -d <%rhq.system.sysprop.user.timezone%>"); // sometimes this is empty
+ //addRecipeCommand("deploy -f jboss8.tar -d <%rhq.system.sysprop.user.region%>"); // sometimes this doesn't exist
+ addRecipeCommand("deploy -f jboss9.tar -d <%rhq.system.sysprop.user.country%>");
+ addRecipeCommand("deploy -f jboss10.tar -d <%rhq.system.sysprop.user.language%>");
+ addRecipeCommand("deploy -f jboss11.tar -d <%rhq.system.sysprop.custom.sysprop%>"); // non-standard sysprop
RecipeParser parser = new RecipeParser();
parser.setReplaceReplacementVariables(true);
RecipeContext context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
Map<String, String> files = context.getDeployFiles();
- assert files.containsKey("jboss1.tar") : files;
assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
- assert files.containsKey("jboss2.tar") : files;
- assert files.get("jboss2.tar").equals("<%custom.sysprop%>") : files;
+ assert files.get("jboss2.tar").equals(System.getProperty("file.separator")) : files;
+ //assert files.get("jboss3.tar").equals(System.getProperty("line.separator")) : files;
+ assert files.get("jboss4.tar").equals(System.getProperty("path.separator")) : files;
+ assert files.get("jboss5.tar").equals(System.getProperty("java.home")) : files;
+ assert files.get("jboss6.tar").equals(System.getProperty("java.version")) : files;
+ //assert files.get("jboss7.tar").equals(System.getProperty("user.timezone")) : files;
+ //assert files.get("jboss8.tar").equals(System.getProperty("user.region")) : files;
+ assert files.get("jboss9.tar").equals(System.getProperty("user.country")) : files;
+ assert files.get("jboss10.tar").equals(System.getProperty("user.language")) : files;
+ assert files.get("jboss11.tar").equals("<%rhq.system.sysprop.custom.sysprop%>") : files;
- // now set our custom system property and see that it gets replaced properly
+ // now set a custom system property and see that it does NOT get replaced - we ignore custom sysprops!
System.setProperty("custom.sysprop", "MY/CUSTOM/PROPERTY/HERE");
parser = new RecipeParser();
parser.setReplaceReplacementVariables(true);
context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
files = context.getDeployFiles();
- assert files.containsKey("jboss1.tar") : files;
- assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
- assert files.containsKey("jboss2.tar") : files;
- assert files.get("jboss2.tar").equals("MY/CUSTOM/PROPERTY/HERE") : files;
+ assert files.get("jboss11.tar").equals("<%rhq.system.sysprop.custom.sysprop%>") : files;
}
public void testSimpleRecipe() throws Exception {
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 3783495..8d9e05d 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
@@ -365,8 +365,16 @@ public class SystemInfoFactory {
SystemInfo systemInfo = createSystemInfo();
Map<String, String> tokens = new HashMap<String, String>();
- tokens.put(TOKEN_PREFIX + "hostname", systemInfo.getHostname());
+ // support several standard Java system properties
+ String[] syspropsToSupport = new String[] { "java.io.tmpdir", "file.separator", "line.separator",
+ "path.separator", "java.home", "java.version", "user.timezone", "user.region", "user.country",
+ "user.language" };
+ for (String sysprop : syspropsToSupport) {
+ tokens.put(TOKEN_PREFIX + "sysprop." + sysprop, System.getProperty(sysprop, sysprop)); // default is the name itself, just to show it wasn't there
+ }
+
+ tokens.put(TOKEN_PREFIX + "hostname", systemInfo.getHostname());
tokens.put(TOKEN_PREFIX + "os.name", systemInfo.getOperatingSystemName());
tokens.put(TOKEN_PREFIX + "os.version", systemInfo.getOperatingSystemVersion());
tokens.put(TOKEN_PREFIX + "os.type", systemInfo.getOperatingSystemType().toString());
commit 35b93622b191bbc8a8014f35f83aea6e47df60d7
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 12:16:45 2010 -0400
never mind, don't support sysprop fallback
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index 6f2a3e0..d748463 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -48,12 +48,6 @@ public class TemplateEngine implements Serializable {
String value = tokens.get(key);
if (value != null) {
next = value;
- } else {
- // fallback is to see if the replacement key represents a Java system prop
- value = System.getProperty(key);
- if (value != null) {
- next = value;
- }
}
}
//If we didn't find a replacement for the key
14 years, 1 month
[rhq] Branch 'gwt' - modules/common
by mazz
modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
New commits:
commit cdfc55d9f42b1bc43ca5b6afae39f75eabce343d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:35:18 2010 -0400
test the different gnu getop ways to specify the args
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index d36831b..c997d57 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -41,23 +41,27 @@ public class RecipeParserTest {
}
public void testConfigDefRecipe() throws Exception {
+ addRecipeCommand("configdef --name=my.first.property");
addRecipeCommand("configdef -n custom.prop");
RecipeParser parser = new RecipeParser();
RecipeContext context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
Set<String> vars = context.getReplacementVariables();
- assert vars.size() == 1 : vars;
+ assert vars.size() == 2 : vars;
+ assert vars.contains("my.first.property");
assert vars.contains("custom.prop");
}
public void testRealizeRecipe() throws Exception {
addRecipeCommand("realize --file=<%opt.dir%>/config.ini");
+ addRecipeCommand("realize -f <%opt2.dir%>/config2.ini");
RecipeParser parser = new RecipeParser();
RecipeContext context = new RecipeContext(getRecipe());
parser.parseRecipe(context);
Set<String> files = context.getRealizedFiles();
- assert files.size() == 1 : files;
+ assert files.size() == 2 : files;
assert files.contains("<%opt.dir%>/config.ini") : files;
+ assert files.contains("<%opt2.dir%>/config2.ini") : files;
}
public void testFileRecipe() throws Exception {
14 years, 1 month
[rhq] Branch 'gwt' - 3 commits - modules/common modules/core
by mazz
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java | 81 ++++++++++
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java | 1
modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java | 36 ++++
modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java | 8
4 files changed, 125 insertions(+), 1 deletion(-)
New commits:
commit 716420b870b9eb6ce9a6b39cd6973cafbf0267e1
Merge: 0eb9524... 9b6a941...
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:20:21 2010 -0400
Merge branch 'gwt' of ssh://git.fedorahosted.org/git/rhq/rhq into gwt
commit 0eb9524ead03b9323a27aa6dc3c18f8fe49526b4
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:19:40 2010 -0400
add new configdef recipe command so we can specify a replacement variable that may exist in bundle files that are to be realized
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java
new file mode 100644
index 0000000..54f297c
--- /dev/null
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/ConfigDefRecipeCommand.java
@@ -0,0 +1,81 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.rhq.bundle.filetemplate.recipe;
+
+import gnu.getopt.Getopt;
+import gnu.getopt.LongOpt;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ConfigDefRecipeCommand implements RecipeCommand {
+
+ public String getName() {
+ return "configdef";
+ }
+
+ public void parse(RecipeParser parser, RecipeContext context, String[] args) {
+ String sopts = ":n:";
+ LongOpt[] lopts = { new LongOpt("name", LongOpt.REQUIRED_ARGUMENT, null, 'n') };
+
+ String replacementVariableName = null;
+
+ Getopt getopt = new Getopt(getName(), args, sopts, lopts);
+ int code;
+
+ while ((code = getopt.getopt()) != -1) {
+ switch (code) {
+ case ':':
+ case '?': {
+ throw new IllegalArgumentException("Bad recipe command.");
+ }
+
+ case 1: {
+ throw new IllegalArgumentException("Bad recipe command!");
+ }
+
+ case 'n': {
+ replacementVariableName = getopt.getOptarg();
+ break;
+ }
+
+ default: {
+ throw new IllegalArgumentException("Unexpected error in recipe command");
+ }
+
+ }
+ }
+
+ if (replacementVariableName == null) {
+ throw new IllegalArgumentException(
+ "Did not specify the name of the configuration definition replacement variable");
+ }
+
+ Set<String> replacementVariableNames = new HashSet<String>(1);
+ replacementVariableNames.add(replacementVariableName);
+ context.addReplacementVariables(replacementVariableNames);
+
+ return;
+ }
+}
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
index d48c3ba..ea9464d 100644
--- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
@@ -129,6 +129,7 @@ public class RecipeParser {
HashMap<String, RecipeCommand> commands = new HashMap<String, RecipeCommand>();
RecipeCommand[] knownCommands = new RecipeCommand[] { new ScriptRecipeCommand(), //
+ new ConfigDefRecipeCommand(), //
new CommandRecipeCommand(), //
new FileRecipeCommand(), //
new RealizeRecipeCommand(), //
diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
index bfa58e6..d36831b 100644
--- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
+++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java
@@ -40,6 +40,16 @@ public class RecipeParserTest {
cleanRecipe();
}
+ public void testConfigDefRecipe() throws Exception {
+ addRecipeCommand("configdef -n custom.prop");
+ RecipeParser parser = new RecipeParser();
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
+ Set<String> vars = context.getReplacementVariables();
+ assert vars.size() == 1 : vars;
+ assert vars.contains("custom.prop");
+ }
+
public void testRealizeRecipe() throws Exception {
addRecipeCommand("realize --file=<%opt.dir%>/config.ini");
RecipeParser parser = new RecipeParser();
@@ -114,6 +124,32 @@ public class RecipeParserTest {
assert files.get("jboss3.tar").equals(SystemInfoFactory.createSystemInfo().getHostname() + "/jboss") : files;
}
+ public void testSimpleRecipeReplaceJavaSystemPropertyReplacementVariables() throws Exception {
+ addRecipeCommand("deploy -f jboss1.tar -d <%java.io.tmpdir%>");
+ addRecipeCommand("deploy -f jboss2.tar -d <%custom.sysprop%>");
+ RecipeParser parser = new RecipeParser();
+ parser.setReplaceReplacementVariables(true);
+ RecipeContext context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
+ Map<String, String> files = context.getDeployFiles();
+ assert files.containsKey("jboss1.tar") : files;
+ assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
+ assert files.containsKey("jboss2.tar") : files;
+ assert files.get("jboss2.tar").equals("<%custom.sysprop%>") : files;
+
+ // now set our custom system property and see that it gets replaced properly
+ System.setProperty("custom.sysprop", "MY/CUSTOM/PROPERTY/HERE");
+ parser = new RecipeParser();
+ parser.setReplaceReplacementVariables(true);
+ context = new RecipeContext(getRecipe());
+ parser.parseRecipe(context);
+ files = context.getDeployFiles();
+ assert files.containsKey("jboss1.tar") : files;
+ assert files.get("jboss1.tar").equals(System.getProperty("java.io.tmpdir")) : files;
+ assert files.containsKey("jboss2.tar") : files;
+ assert files.get("jboss2.tar").equals("MY/CUSTOM/PROPERTY/HERE") : files;
+ }
+
public void testSimpleRecipe() throws Exception {
addRecipeCommand("deploy -f jboss.tar -d /opt/jboss");
addRecipeCommand("deploy -f tomcat.tar -d /opt/tomcat");
commit c165b0103c5171b004700db50363d9bc56632931
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Mar 23 09:18:44 2010 -0400
all for recipe replacement variables to represent Java system properties
diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
index 113771d..6f2a3e0 100644
--- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
+++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java
@@ -5,7 +5,7 @@ import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class TemplateEngine implements Serializable{
+public class TemplateEngine implements Serializable {
/**
*
*/
@@ -48,6 +48,12 @@ public class TemplateEngine implements Serializable{
String value = tokens.get(key);
if (value != null) {
next = value;
+ } else {
+ // fallback is to see if the replacement key represents a Java system prop
+ value = System.getProperty(key);
+ if (value != null) {
+ next = value;
+ }
}
}
//If we didn't find a replacement for the key
14 years, 1 month
[rhq] Branch 'gwt' - 4 commits - modules/common modules/enterprise
by Jay Shaughnessy
modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java | 36 +----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java | 68 ++++------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java | 24 ---
modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java | 5
5 files changed, 52 insertions(+), 83 deletions(-)
New commits:
commit 9b6a9419e52a21fce453ac6f638541298f9e3a94
Merge: 5ca5f89... 986f0d2...
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:25:08 2010 -0400
Merge branch 'gwt' into gwt-jay
commit 5ca5f894d2473a61d93c8bee15ab40bd41468683
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:22:22 2010 -0400
First version of deploy wizard that actually deploys something!
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
index e3bc504..55d1a7f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployNowStep.java
@@ -27,15 +27,14 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
public class DeployNowStep implements WizardStep {
- private DynamicForm form;
- private final BundleDeployWizard wizard;
+ static private final String DEPLOY_LATER = "later";
+ static private final String DEPLOY_NOW = "now";
- private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ private final BundleDeployWizard wizard;
+ private DynamicForm form;
public DeployNowStep(BundleDeployWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
@@ -52,16 +51,17 @@ public class DeployNowStep implements WizardStep {
form.setNumCols(2);
form.setColWidths("50%", "*");
- LinkedHashMap<String, Boolean> values = new LinkedHashMap<String, Boolean>();
- values.put("Deploy Now", Boolean.TRUE);
- values.put("Save Definition and Deploy Later", Boolean.FALSE);
- final RadioGroupItem radioGroupItem = new RadioGroupItem("options", "Deploy Options");
+ RadioGroupItem radioGroupItem = new RadioGroupItem("deployTime", "Deployment Time");
+ LinkedHashMap<String, String> radioGroupValues = new LinkedHashMap<String, String>();
+ radioGroupValues.put(DEPLOY_NOW, "Deploy Now");
+ radioGroupValues.put(DEPLOY_LATER, "Save Definition and Deploy Later");
radioGroupItem.setRequired(true);
- radioGroupItem.setValueMap(values);
+ radioGroupItem.setValueMap(radioGroupValues);
+ radioGroupItem.setValue(DEPLOY_NOW);
+ wizard.setDeployNow(true);
radioGroupItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
- wizard.setDeployNow((Boolean) event.getValue());
- enableNextButtonWhenAppropriate();
+ wizard.setDeployNow(DEPLOY_NOW.equals(event.getValue()));
}
});
@@ -74,19 +74,7 @@ public class DeployNowStep implements WizardStep {
return form.validate();
}
- public boolean isNextEnabled() {
- return (null != this.wizard.getDeployNow());
- }
-
public boolean isPreviousEnabled() {
return true;
}
-
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
-
- private boolean isNotEmpty(String s) {
- return (s != null && s.trim().length() > 0);
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
index bbf30bf..f06e278 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/DeployStep.java
@@ -46,6 +46,10 @@ public class DeployStep implements WizardStep {
this.wizard = bundleCreationWizard;
}
+ public String getName() {
+ return "Deploy Bundle to Target Platforms";
+ }
+
public Canvas getCanvas() {
if (canvas == null) {
canvas = new VLayout();
@@ -66,7 +70,7 @@ public class DeployStep implements WizardStep {
if (wizard.isNewDefinition()) {
bundleServer.createBundleDeployDefinition(wizard.getBundleVersion().getId(), wizard.getName(), wizard
- .getDescription(), wizard.getConfig(), false, -1, false,
+ .getDescription(), wizard.getConfig(), false, -1, false, //
new AsyncCallback<BundleDeployDefinition>() {
public void onSuccess(BundleDeployDefinition result) {
deployingImage.setSrc("/images/status_complete.gif");
@@ -75,62 +79,52 @@ public class DeployStep implements WizardStep {
new Message("Created deploy definition [" + result.getName() + "] description ["
+ result.getDescription(), Severity.Info));
wizard.setBundleDeployDefinition(result);
- enableNextButtonWhenAppropriate();
+
+ bundleServer.scheduleBundleDeployment(wizard.getBundleDeployDefinition().getId(), wizard
+ .getPlatformId(), //
+ new AsyncCallback<BundleDeployment>() {
+ public void onSuccess(BundleDeployment result) {
+ deployingImage.setSrc("/images/status_complete.gif");
+ deployingMessage.setText("Bundle Deployment Scheduled!");
+ CoreGUI.getMessageCenter().notify(
+ new Message("Schedule bundle deployment ["
+ + wizard.getBundleDeployDefinition().getName() + "] resource ["
+ + result.getResource() + "]", Severity.Info));
+ wizard.setBundleDeployment(result);
+ }
+
+ public void onFailure(Throwable caught) {
+ deployingImage.setSrc("/images/status_error.gif");
+ deployingMessage.setText("Failed to Schedule Deployment!");
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to schedule deployment: " + caught.getMessage(), caught);
+ wizard.setBundleDeployment(null);
+ }
+ });
}
public void onFailure(Throwable caught) {
deployingImage.setSrc("/images/status_error.gif");
- deployingMessage.setText("Failed to create deply definition!");
+ deployingMessage.setText("Failed to create deploy definition!");
CoreGUI.getErrorHandler().handleError(
"Failed to create deploy definition: " + caught.getMessage(), caught);
- enableNextButtonWhenAppropriate();
}
});
}
-
- bundleServer.scheduleBundleDeployment(wizard.getBundleDeployDefinition().getId(), wizard.getPlatformId(),
- new AsyncCallback<BundleDeployment>() {
- public void onSuccess(BundleDeployment result) {
- deployingImage.setSrc("/images/status_complete.gif");
- deployingMessage.setText("Bundle Deployment Scheduled!");
- CoreGUI.getMessageCenter().notify(
- new Message("Schedule bundle deployment [" + wizard.getBundleDeployDefinition().getName()
- + "] resource [" + result.getResource() + "]", Severity.Info));
- wizard.setBundleDeployment(result);
- enableNextButtonWhenAppropriate();
- }
-
- public void onFailure(Throwable caught) {
- deployingImage.setSrc("/images/status_error.gif");
- deployingMessage.setText("Failed to Schedule Deployment!");
- CoreGUI.getErrorHandler().handleError("Failed to schedule deployment: " + caught.getMessage(),
- caught);
- wizard.setBundleDeployment(null);
- enableNextButtonWhenAppropriate();
- }
- });
}
return canvas;
}
- public boolean nextPage() {
- return this.wizard.getBundleVersion() != null;
- }
-
- public String getName() {
- return "Deploy Bundle to Target Platforms";
- }
-
public boolean isNextEnabled() {
- return this.wizard.getBundleDeployment() != null;
+ return false;
}
public boolean isPreviousEnabled() {
return true;
}
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
+ public boolean nextPage() {
+ return false;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
index d523fbe..94a4707 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/SelectPlatformsStep.java
@@ -25,20 +25,20 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
public class SelectPlatformsStep implements WizardStep {
- private DynamicForm form;
private final BundleDeployWizard wizard;
-
- private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
+ private DynamicForm form;
public SelectPlatformsStep(BundleDeployWizard bundleCreationWizard) {
this.wizard = bundleCreationWizard;
}
+ public String getName() {
+ return "Select Target Platforms";
+ }
+
public Canvas getCanvas() {
if (form == null) {
form = new DynamicForm();
@@ -55,9 +55,7 @@ public class SelectPlatformsStep implements WizardStep {
if (value == null) {
value = "";
}
- wizard.setSubtitle(value.toString());
wizard.setPlatformId(Integer.valueOf(value.toString()));
- enableNextButtonWhenAppropriate();
}
});
@@ -71,19 +69,7 @@ public class SelectPlatformsStep implements WizardStep {
return form.validate();
}
- public String getName() {
- return "Select Target Platforms";
- }
-
- public boolean isNextEnabled() {
- return (null != this.wizard.getPlatformId());
- }
-
public boolean isPreviousEnabled() {
return true;
}
-
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
}
commit 2717080092cbcd4c08f5c0ac7940e284401bc11c
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:21:46 2010 -0400
Make sure display name is set for recipe config items, otherwise the
ConfigurationEditor will display nulls.
diff --git a/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java b/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
index 342b5b1..a4d7bc9 100644
--- a/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
+++ b/modules/enterprise/server/plugins/filetemplate-bundle/src/main/java/org/rhq/enterprise/server/plugins/filetemplate/BundleServerPluginComponent.java
@@ -85,8 +85,9 @@ public class BundleServerPluginComponent implements ServerPluginComponent, Bundl
if (recipeContext.getReplacementVariables() != null) {
configDef = new ConfigurationDefinition("replacementVariables", null);
for (String replacementVar : recipeContext.getReplacementVariables()) {
- PropertyDefinitionSimple prop = new PropertyDefinitionSimple(replacementVar, null, false,
- PropertySimpleType.STRING);
+ PropertyDefinitionSimple prop = new PropertyDefinitionSimple(replacementVar,
+ "Needed by bundle recipe.", false, PropertySimpleType.STRING);
+ prop.setDisplayName(replacementVar);
configDef.put(prop);
}
}
commit 2c7d193fcb8a1e92e6171af2a151ff1208ab0df0
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Mar 22 21:20:27 2010 -0400
make sure the replacement string is escaped such that regex characters are
taken as literals (to handle, for example, windows paths)
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
index d48c3ba..ae6c0a5 100644
--- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
+++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java
@@ -188,7 +188,7 @@ public class RecipeParser {
}
// If we didn't find a replacement for the key then leave the original value unchanged
- matcher.appendReplacement(buffer, next);
+ matcher.appendReplacement(buffer, Matcher.quoteReplacement(next));
}
matcher.appendTail(buffer);
return buffer.toString();
14 years, 1 month
[rhq] Branch 'gwt' - modules/core modules/enterprise
by mazz
modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java | 20 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java | 93 --------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java | 38 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java | 112 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java | 20 +
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java | 24 +-
7 files changed, 196 insertions(+), 117 deletions(-)
New commits:
commit 986f0d22343472822ed6d86f812ba3504e14df10
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Mar 22 17:06:00 2010 -0400
get gwt to use the new criteria and show things like the latest version
also get the delete button to work - you can delete a bundle
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
index 40ca18d..cc16d2d 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/composite/BundleWithLatestVersionComposite.java
@@ -31,16 +31,20 @@ public class BundleWithLatestVersionComposite implements Serializable {
private String bundleName;
private String bundleDescription;
private String latestVersion;
- private Long deploymentCount;
+ private Long versionsCount;
+
+ public BundleWithLatestVersionComposite() {
+ // GWT needs this
+ }
public BundleWithLatestVersionComposite(Integer bundleId, String bundleName, String bundleDescription,
- String latestVersion, Long deploymentCount) {
+ String latestVersion, Long versionsCount) {
this.bundleId = bundleId;
this.bundleName = bundleName;
this.bundleDescription = bundleDescription;
this.latestVersion = latestVersion;
- this.deploymentCount = deploymentCount;
+ this.versionsCount = versionsCount;
}
public Integer getBundleId() {
@@ -75,12 +79,12 @@ public class BundleWithLatestVersionComposite implements Serializable {
this.latestVersion = latestVersion;
}
- public Long getDeploymentCount() {
- return deploymentCount;
+ public Long getVersionsCount() {
+ return versionsCount;
}
- public void setDeploymentCount(Long deploymentCount) {
- this.deploymentCount = deploymentCount;
+ public void setVersionsCount(Long versionsCount) {
+ this.versionsCount = versionsCount;
}
public String toString() {
@@ -89,7 +93,7 @@ public class BundleWithLatestVersionComposite implements Serializable {
builder.append(", bundleName=").append(bundleName);
builder.append(", bundleDescription=").append(bundleDescription);
builder.append(", latestVersion=").append(latestVersion);
- builder.append(", deploymentCount=").append(deploymentCount);
+ builder.append(", versionsCount=").append(versionsCount);
builder.append("]");
return builder.toString();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java
deleted file mode 100644
index 4bdc68b..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleVerificationStep.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.gui.coregui.client.bundle.create;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.Label;
-import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Img;
-import com.smartgwt.client.widgets.layout.VLayout;
-
-import org.rhq.core.domain.bundle.BundleVersion;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.components.wizard.WizardStep;
-import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
-
-public class BundleVerificationStep implements WizardStep {
-
- private final BundleCreateWizard wizard;
-
- private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
- private VLayout canvas;
-
- public BundleVerificationStep(BundleCreateWizard bundleCreationWizard) {
- this.wizard = bundleCreationWizard;
- }
-
- public Canvas getCanvas() {
- if (canvas != null && wizard.getBundleVersion() != null) {
- // if we've already got a persisted bundle version, don't verify it again or try to create it again
- return canvas;
- }
-
- canvas = new VLayout();
- canvas.setWidth100();
- canvas.setHeight100();
- canvas.setAlign(Alignment.CENTER);
-
- final Img verifyingImage = new Img("/images/status-bar.gif");
- verifyingImage.setLayoutAlign(Alignment.CENTER);
- verifyingImage.setWidth(50);
- verifyingImage.setHeight(15);
-
- final Label verifiedMessage = new Label("Verifying...");
- verifiedMessage.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
-
- canvas.addMember(verifyingImage);
- canvas.addMember(verifiedMessage);
-
-
- return canvas;
- }
-
- public boolean nextPage() {
- return this.wizard.getBundleVersion() != null;
- }
-
- public String getName() {
- return "Verify Recipe";
- }
-
- public boolean isNextEnabled() {
- return this.wizard.getBundleVersion() != null;
- }
-
- public boolean isPreviousEnabled() {
- return true;
- }
-
- private void enableNextButtonWhenAppropriate() {
- this.wizard.getView().getNextButton().setDisabled(!isNextEnabled());
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index 155dcdd..d702b9b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -18,17 +18,24 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.list;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.bundle.create.BundleCreateWizard;
-import org.rhq.enterprise.gui.coregui.client.bundle.deploy.BundleDeployWizard;
import org.rhq.enterprise.gui.coregui.client.bundle.create.BundleUpdateWizard;
+import org.rhq.enterprise.gui.coregui.client.bundle.deploy.BundleDeployWizard;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
* @author Greg Hinkle
@@ -39,13 +46,15 @@ public class BundlesListView extends VLayout {
protected void onDraw() {
super.onDraw();
- Table table = new Table("Bundles");
+ final Table table = new Table("Bundles");
- table.setDataSource(new BundlesDataSource());
+ table.setDataSource(new BundlesWithLatestVersionDataSource());
table.getListGrid().getField("id").setWidth("60");
table.getListGrid().getField("name").setWidth("25%");
- table.getListGrid().getField("description").setWidth("*");
+ table.getListGrid().getField("description").setWidth("25%");
+ table.getListGrid().getField("latestVersion").setWidth("25%");
+ table.getListGrid().getField("versionsCount").setWidth("*");
table.getListGrid().setSelectionType(SelectionStyle.SIMPLE);
table.getListGrid().setSelectionAppearance(SelectionAppearance.CHECKBOX);
@@ -57,6 +66,27 @@ public class BundlesListView extends VLayout {
}
});
+ table.addTableAction("Delete Bundle", Table.SelectionEnablement.ANY, "Are You Sure?", new TableAction() {
+ public void executeAction(ListGridRecord[] selections) {
+ BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) table.getDataSource();
+ for (ListGridRecord selection : selections) {
+ BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
+ final BundleWithLatestVersionComposite object = ds.copyValues(selection);
+ bundleManager.deleteBundle(object.getBundleId(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ "Failed to delete bundle [" + object.getBundleName() + "]", caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("Deleted bundle [" + object.getBundleName() + "]", Severity.Info));
+ }
+ });
+ }
+ }
+ });
+
table.addTableAction("Update Bundle", Table.SelectionEnablement.SINGLE, null, new TableAction() {
public void executeAction(ListGridRecord[] selection) {
Bundle bundle = (Bundle) selection[0].getAttributeAsObject("entity");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
new file mode 100644
index 0000000..9f8b106
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
@@ -0,0 +1,112 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.list;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author John Mazzitelli
+ */
+public class BundlesWithLatestVersionDataSource extends RPCDataSource<BundleWithLatestVersionComposite> {
+
+ private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
+
+ public BundlesWithLatestVersionDataSource() {
+
+ DataSourceIntegerField idField = new DataSourceIntegerField("id", "ID");
+ idField.setPrimaryKey(true);
+ addField(idField);
+
+ DataSourceTextField nameField = new DataSourceTextField("name", "Name");
+ addField(nameField);
+
+ DataSourceTextField descriptionField = new DataSourceTextField("description", "Description");
+ addField(descriptionField);
+
+ DataSourceTextField latestVersionField = new DataSourceTextField("latestVersion", "Latest Version");
+ addField(latestVersionField);
+
+ DataSourceIntegerField deploymentCountField = new DataSourceIntegerField("versionsCount", "Versions Count");
+ addField(deploymentCountField);
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+
+ BundleCriteria criteria = new BundleCriteria();
+ criteria.setPageControl(getPageControl(request));
+
+ bundleService.findBundlesWithLastestVersionCompositesByCriteria(criteria,
+ new AsyncCallback<PageList<BundleWithLatestVersionComposite>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError("Failed to load bundle-with-latest-version data", caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<BundleWithLatestVersionComposite> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+
+ }
+
+ @Override
+ public BundleWithLatestVersionComposite copyValues(ListGridRecord from) {
+ Integer idAttrib = from.getAttributeAsInt("id");
+ String nameAttrib = from.getAttribute("name");
+ String descriptionAttrib = from.getAttribute("description");
+ String latestVersionAttrib = from.getAttribute("latestVersion");
+ Integer versionsCountAttrib = from.getAttributeAsInt("versionsCount");
+
+ return new BundleWithLatestVersionComposite(idAttrib, nameAttrib, descriptionAttrib, latestVersionAttrib,
+ versionsCountAttrib.longValue());
+ }
+
+ @Override
+ public ListGridRecord copyValues(BundleWithLatestVersionComposite from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute("id", from.getBundleId());
+ record.setAttribute("name", from.getBundleName());
+ record.setAttribute("description", from.getBundleDescription());
+ record.setAttribute("latestVersion", from.getLatestVersion());
+ record.setAttribute("versionsCount", Integer.valueOf(from.getVersionsCount().intValue())); // want int, not long
+
+ record.setAttribute("object", from);
+
+ return record;
+
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index 82d6166..c257909 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -28,6 +28,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
@@ -46,12 +47,17 @@ public interface BundleGWTService extends RemoteService {
BundleVersion createBundleVersion(int bundleId, String name, String version, String recipe) throws Exception;
+ void deleteBundle(int bundleId);
+
void deleteBundleVersion(int bundleVersionId);
PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws Exception;
PageList<BundleVersion> findBundleVersionsByCriteria(BundleVersionCriteria criteria) throws Exception;
+ PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(BundleCriteria criteria)
+ throws Exception;
+
HashMap<String, Boolean> getAllBundleVersionFilenames(int bundleVersionId) throws Exception;
ArrayList<BundleType> getAllBundleTypes();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index 4cc3293..25eba1c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -26,6 +26,7 @@ import org.rhq.core.domain.bundle.BundleDeployDefinition;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
@@ -88,6 +89,14 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
return SerialUtility.prepare(results, "createBundleVersion");
}
+ public void deleteBundle(int bundleId) {
+ try {
+ bundleManager.deleteBundle(getSessionSubject(), bundleId);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void deleteBundleVersion(int bundleVersionId) {
try {
bundleManager.deleteBundleVersion(getSessionSubject(), bundleVersionId);
@@ -114,6 +123,17 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ public PageList<BundleWithLatestVersionComposite> findBundlesWithLastestVersionCompositesByCriteria(
+ BundleCriteria criteria) {
+ try {
+ PageList<BundleWithLatestVersionComposite> results;
+ results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(getSessionSubject(), criteria);
+ return SerialUtility.prepare(results, "findBundlesWithLastestVersionCompositesByCriteria");
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public ArrayList<BundleType> getAllBundleTypes() {
try {
ArrayList<BundleType> bundleTypes = new ArrayList<BundleType>();
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
index e0190e6..c2284d9 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/bundle/BundleManagerBeanTest.java
@@ -282,7 +282,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion() == null;
- assert results.get(0).getDeploymentCount().longValue() == 0L;
+ assert results.get(0).getVersionsCount().longValue() == 0L;
BundleVersion bv1 = createBundleVersion(b1.getName() + "-1", "1.0", b1);
assertNotNull(bv1);
@@ -293,7 +293,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("1.0");
- assert results.get(0).getDeploymentCount().longValue() == 1L;
+ assert results.get(0).getVersionsCount().longValue() == 1L;
BundleVersion bv2 = createBundleVersion(b1.getName() + "-2", "2.0", b1);
assertNotNull(bv2);
@@ -304,7 +304,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 2L;
+ assert results.get(0).getVersionsCount().longValue() == 2L;
BundleVersion bv3 = createBundleVersion(b1.getName() + "-3", "1.5", b1);
assertNotNull(bv3);
@@ -315,7 +315,7 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 3L;
+ assert results.get(0).getVersionsCount().longValue() == 3L;
BundleVersionCriteria c = new BundleVersionCriteria();
PageList<BundleVersion> bvs = null;
@@ -376,12 +376,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getVersionsCount().longValue() == 4L;
assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion() == null;
- assert results.get(1).getDeploymentCount().longValue() == 0L;
+ assert results.get(1).getVersionsCount().longValue() == 0L;
BundleVersion b2_bv1 = createBundleVersion(b2.getName() + "-5", "9.1", b2);
assertNotNull(b2_bv1);
@@ -393,12 +393,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getVersionsCount().longValue() == 4L;
assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
- assert results.get(1).getDeploymentCount().longValue() == 1L;
+ assert results.get(1).getVersionsCount().longValue() == 1L;
// test sorting of the BundleWithLastestVersionComposite
criteria.addSortName(PageOrdering.DESC);
@@ -408,12 +408,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(1).getBundleName().equals(b1.getName());
assert results.get(1).getBundleDescription().equals(b1.getDescription());
assert results.get(1).getLatestVersion().equals("2.0");
- assert results.get(1).getDeploymentCount().longValue() == 4L;
+ assert results.get(1).getVersionsCount().longValue() == 4L;
assert results.get(0).getBundleId().equals(b2.getId());
assert results.get(0).getBundleName().equals(b2.getName());
assert results.get(0).getBundleDescription().equals(b2.getDescription());
assert results.get(0).getLatestVersion().equals("9.1");
- assert results.get(0).getDeploymentCount().longValue() == 1L;
+ assert results.get(0).getVersionsCount().longValue() == 1L;
criteria.addSortName(PageOrdering.ASC);
results = bundleManager.findBundlesWithLastestVersionCompositesByCriteria(overlord, criteria);
@@ -422,12 +422,12 @@ public class BundleManagerBeanTest extends UpdateSubsytemTestBase {
assert results.get(0).getBundleName().equals(b1.getName());
assert results.get(0).getBundleDescription().equals(b1.getDescription());
assert results.get(0).getLatestVersion().equals("2.0");
- assert results.get(0).getDeploymentCount().longValue() == 4L;
+ assert results.get(0).getVersionsCount().longValue() == 4L;
assert results.get(1).getBundleId().equals(b2.getId());
assert results.get(1).getBundleName().equals(b2.getName());
assert results.get(1).getBundleDescription().equals(b2.getDescription());
assert results.get(1).getLatestVersion().equals("9.1");
- assert results.get(1).getDeploymentCount().longValue() == 1L;
+ assert results.get(1).getVersionsCount().longValue() == 1L;
}
@Test(enabled = TESTS_ENABLED)
14 years, 1 month