001: package com.sun.portal.ubt.admin.mbeans;
002:
003: import com.sun.portal.admin.common.PSMBeanException;
004: import com.sun.portal.admin.common.util.AdminUtil;
005: import com.sun.portal.admin.common.context.PSConfigContext;
006: import com.sun.portal.admin.common.context.PortalDomainContext;
007: import com.sun.portal.admin.server.mbeans.PSResource;
008: import com.sun.portal.admin.server.AdminServerUtil;
009: import com.sun.portal.admin.server.PASModule;
010: import com.sun.portal.log.common.PortalLogger;
011: import com.sun.portal.ubt.report.server.UBTReportGenAggregator;
012: import com.sun.portal.ubt.report.server.UBTReportGeneratorException;
013: import com.sun.portal.ubt.report.view.report.UBTReportI;
014: import com.sun.portal.ubt.report.view.IllegalMinerException;
015:
016: import javax.management.*;
017: import javax.management.remote.JMXConnector;
018: import java.util.logging.Logger;
019: import java.util.logging.Level;
020: import java.util.logging.LogRecord;
021: import java.util.*;
022: import java.io.IOException;
023:
024: /**
025: *
026: */
027: public class UBTReportAggregator extends PSResource implements
028: UBTReportAggregatorMBean {
029: private String psPortalID;
030: private static Logger logger = PortalLogger
031: .getLogger(UBTReportAggregator.class);
032: private static final String INSTANCE_PATTRN = "%instance";
033:
034: /**
035: * Initializes this UBT Report mbean with the given Portal
036: * Server configuration context, portal domain context, and path.
037: *
038: * @param cc the Portal Server configuration context.
039: * @param pdc the portal domain context.
040: * @param path the path to identify this resource instance.
041: */
042: public void init(PSConfigContext cc, PortalDomainContext pdc,
043: List path) {
044: super .init(cc, pdc, path);
045: psPortalID = (String) path.get(1);
046: }
047:
048: public Object generateUBTReport(String reportName, Locale locale)
049: throws PSMBeanException, IllegalMinerException,
050: UBTReportGeneratorException {
051: setThreadContextClassLoader();
052: return generateUBTReport(
053: reportName != null ? new String[] { reportName } : null,
054: locale);
055: }
056:
057: private void setThreadContextClassLoader() {
058: Thread.currentThread().setContextClassLoader(
059: UBTReportAggregator.class.getClassLoader());
060: }
061:
062: private ObjectName getReportBeanName()
063: throws MalformedObjectNameException {
064: LinkedList path = new LinkedList();
065: path.addFirst(m_sPsDomainID);
066: path.addFirst(psPortalID);
067: path.addFirst("UBTReport");
068: return AdminUtil.getResourceMBeanObjectName(
069: "PortalDomain.Portal.UBTReport", path);
070: }
071:
072: public Object generateUBTReport(String[] reportNames, Locale locale)
073: throws PSMBeanException, IllegalMinerException,
074: UBTReportGeneratorException {
075: setThreadContextClassLoader();
076: //get the list of hosts of portal instances
077: Set hostNames = getHostNames();
078: //Instanctiate server.UBTReportGenAggregator
079: UBTReportGenAggregator reportGenAggregator = new UBTReportGenAggregator(
080: getTemplateDir(), psPortalID, locale);
081: //In a loop
082: Iterator hostNamesI = hostNames.iterator();
083: Object[] params = new Object[] { reportNames };
084: String[] signature = new String[] { java.lang.String[].class
085: .getName() };
086: while (hostNamesI.hasNext()) {
087: String host = (String) hostNamesI.next();
088: //get the mbeanconnection for the host
089: MBeanServerConnection server = null;
090: try {
091: server = this .getConnection(host);
092: //invoke UBTReportMBean.generateUBTReport on that server connection
093: //add the returned object to the aggregator
094: Object object = server.invoke(getReportBeanName(),
095: "getReportData", params, signature);
096: reportGenAggregator.add((TreeMap) object);
097: } catch (Exception e) {
098: LogRecord rec = new LogRecord(Level.WARNING,
099: "PSUB_CSPUAM0007");
100: rec.setParameters(new Object[] { host });
101: rec.setThrown(e);
102: rec.setLoggerName(logger.getName());
103: logger.log(rec);
104: } finally {
105: this .closeRemoteConnection(server);
106: }
107: }
108: //call getReportAggregatedReports
109: //call generateReport
110: return reportGenAggregator.generateReport(reportGenAggregator
111: .getAggregatedReports());
112: }
113:
114: public Set getHostNames() {
115: Set iNames = new TreeSet();
116: String portalId = null;
117: try {
118: Set objNames = getInstanceObjectNames();
119: Iterator iter = objNames.iterator();
120: MBeanServer server = getLocalMBeanServerConnection();
121: while (iter.hasNext()) {
122: iNames.add(server.getAttribute(
123: (ObjectName) iter.next(), "Host"));
124: }
125: } catch (Exception e) {
126: LogRecord rec = new LogRecord(Level.WARNING,
127: "PSUB_CSPUAM0008");
128: rec.setParameters(new Object[] { psPortalID });
129: rec.setThrown(e);
130: rec.setLoggerName(logger.getName());
131: logger.log(rec);
132: }
133: return iNames;
134: }
135:
136: public Set getInstanceObjectNames() throws IOException, Exception {
137: ObjectName instancePat = AdminServerUtil
138: .getPortalServerInstancesPattern(m_sPsDomainID,
139: psPortalID);
140: Set objNames = getLocalMBeanServerConnection().queryNames(
141: instancePat,
142: AdminUtil.getPortalServerInstancesPattern(
143: AdminUtil.DEFAULT_DOMAIN, psPortalID));
144: return objNames;
145: }
146:
147: private MBeanServer getLocalMBeanServerConnection() {
148: return PASModule.getMBeanServer();
149: }
150:
151: /**
152: * To get the template folder path
153: * @return
154: */
155: private String getTemplateDir() {
156: return cc.getPSBaseDir() + fs + "template" + fs + "ubtreport";
157: }
158:
159: private void closeRemoteConnection(
160: MBeanServerConnection serverConnection) {
161: try {
162: if (!serverConnection.equals(PASModule.getMBeanServer()))
163: ((JMXConnector) serverConnection).close();
164: } catch (Exception e) {
165: //drop through it is not open
166: }
167: }
168:
169: private MBeanServerConnection getConnection(String host)
170: throws Exception {
171: MBeanServerConnection serverConnection = null;
172: //find if it is local or remote
173: if (AdminServerUtil.isLocal(host)) {
174: serverConnection = PASModule.getMBeanServer();
175: } else {
176: try {
177: JMXConnector connector = AdminServerUtil
178: .getJMXConnector(host);
179: serverConnection = connector.getMBeanServerConnection();
180: } catch (Exception e) {
181: LogRecord rec = new LogRecord(Level.WARNING,
182: "PSUB_CSPUAM0009");
183: rec.setParameters(new Object[] { host });
184: rec.setThrown(e);
185: rec.setLoggerName(logger.getName());
186: logger.log(rec);
187: throw e;
188: }
189: }
190: return serverConnection;
191: }
192: }
|