/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package de.unioninvestment.eai.portal.portlet.crud.domain.container;
import groovy.util.GroovyMBean;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.management.ObjectName;
import org.slf4j.LoggerFactory;
import com.vaadin.data.Container.Filter;
import de.unioninvestment.eai.portal.portlet.crud.config.JmxContainerConfig;
import de.unioninvestment.eai.portal.portlet.crud.config.JmxContainerConfig.Attribute;
import de.unioninvestment.eai.portal.portlet.crud.domain.exception.BusinessException;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.JMXWrapper;
import de.unioninvestment.eai.portal.portlet.crud.domain.model.user.CurrentUser;
import de.unioninvestment.eai.portal.portlet.crud.domain.support.AuditLogger;
import de.unioninvestment.eai.portal.support.vaadin.container.Column;
import de.unioninvestment.eai.portal.support.vaadin.container.GenericDelegate;
import de.unioninvestment.eai.portal.support.vaadin.container.GenericItem;
import de.unioninvestment.eai.portal.support.vaadin.container.GenericProperty;
import de.unioninvestment.eai.portal.support.vaadin.container.MetaData;
import de.unioninvestment.eai.portal.support.vaadin.container.UpdateContext;
/**
* Backend-Implementation für JMX.
*/
public class JmxDelegate implements GenericDelegate {
private MetaData metadata;
private JMXWrapper jmxWrapper;
private String query;
private static final org.slf4j.Logger LOG = LoggerFactory
.getLogger(JmxDelegate.class);
private List<String> columnNamesWithoutPK;
private ArrayList<String> getterScripts;
private AuditLogger auditLogger;
private String server;
/**
* @param jmxContainerConfig
* the JMX configuration
* @param currentUser
* the current user needed for auditing
*/
public JmxDelegate(JmxContainerConfig jmxContainerConfig,
CurrentUser currentUser) {
metadata = extractMetadataFromConfig(jmxContainerConfig);
jmxWrapper = new JMXWrapper(jmxContainerConfig.getServer());
query = jmxContainerConfig.getQuery();
auditLogger = new AuditLogger(currentUser);
server = jmxContainerConfig.getServer();
}
/**
* @param jmxContainerConfig
* the JMX configuration
* @param currentUser
* the current user needed for auditing
* @param wrapper
* the wrapper class to be used for JMX communication
*/
public JmxDelegate(JmxContainerConfig jmxContainerConfig,
JMXWrapper wrapper, CurrentUser currentUser) {
metadata = extractMetadataFromConfig(jmxContainerConfig);
jmxWrapper = wrapper;
query = jmxContainerConfig.getQuery();
auditLogger = new AuditLogger(currentUser);
server = jmxContainerConfig.getServer();
}
private MetaData extractMetadataFromConfig(
JmxContainerConfig jmxContainerConfig) {
List<Column> colums = new ArrayList<Column>();
List<Attribute> attributsliste = jmxContainerConfig.getAttribute();
colums.add(new Column("mbeanObjectName", String.class, true, true,
true, null));
columnNamesWithoutPK = new ArrayList<String>(attributsliste.size());
getterScripts = new ArrayList<String>(attributsliste.size());
for (Attribute attribute : attributsliste) {
colums.add(new Column(
attribute.getName(),
attribute.getType(),
attribute.isReadonly()
|| attribute.getServerSideGetter() != null,
attribute.isRequired(),
false,
null));
columnNamesWithoutPK.add(attribute.getName());
getterScripts.add(attribute.getServerSideGetter());
}
MetaData metadata = new MetaData(colums, false, true, false, false,
false);
return metadata;
}
@Override
public MetaData getMetaData() {
return metadata;
}
@Override
public List<Object[]> getRows() {
try {
Map<String, ? extends Map<String, ? extends Object>> queryResult = jmxWrapper
.query(
query, columnNamesWithoutPK, getterScripts);
List<Object[]> result = new ArrayList<Object[]>();
for (Entry<String, ? extends Map<String, ? extends Object>> entry : queryResult
.entrySet()) {
Object[] row = new Object[metadata.getColumnNames().size()];
row[0] = entry.getKey();
int i = 1;
for (String columnName : columnNamesWithoutPK) {
row[i++] = entry.getValue().get(columnName);
}
result.add(row);
}
return result;
} catch (Exception e) {
LOG.error("error executing jmx-query", e);
throw new BusinessException("portlet.crud.error.jmxReadError");
}
}
@Override
public void setFilters(Filter[] filters) {
// nichts
}
@Override
public void update(List<GenericItem> items, UpdateContext context) {
for (GenericItem item : items) {
GroovyMBean mbeanProxy;
try {
mbeanProxy = jmxWrapper.proxyFor(item.getId().getId()[0]
.toString());
for (Object propertyID : item.getItemPropertyIds()) {
GenericProperty<?> itemProperty = (GenericProperty<?>) item
.getItemProperty(propertyID);
if (itemProperty.isModified()) {
mbeanProxy.setProperty(propertyID.toString(),
itemProperty.getValue());
ObjectName objectName = mbeanProxy.name();
if (server != null && objectName != null) {
auditLogger.auditMBeanPropertyChange(
server, objectName.getCanonicalName(),
propertyID.toString(), itemProperty);
}
}
}
} catch (Exception e) {
LOG.error("error writing jmx-attribute", e);
throw new BusinessException("portlet.crud.error.jmxWriteError");
}
}
}
/**
* @param query
* the query string to be used for future queries
*/
public void setQuery(String query) {
this.query = query;
}
/**
* @return the current query string
*/
public String getQuery() {
return query;
}
void setJmxWrapper(JMXWrapper jmxWrapper) {
this.jmxWrapper = jmxWrapper;
}
/**
* @return the JMX wrapper
*/
public JMXWrapper getJmxWrapper() {
return jmxWrapper;
}
/**
* @param server
* the server name to be used for future JMX operations
*/
public void setServer(String server) {
this.server = server;
}
}