/*
* 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 org.apache.aries.jmx.blueprint.codec;
import java.util.HashMap;
import java.util.Map;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenDataException;
import org.apache.aries.jmx.blueprint.BlueprintStateMBean;
import org.osgi.service.blueprint.container.BlueprintEvent;
/**
* <p>
* This class represents the CODEC for the composite data representing a OSGi
* <link>BlueprintEvent</link>
* <p>
* It serves as both the documentation of the type structure and as the
* codification of the mechanism to convert to/from the CompositeData.
* <p>
* The structure of the composite data is:
* <table border="1">
* <tr>
* <td>bundleId</td>
* <td>long</td>
* </tr>
* <tr>
* <td>extenderBundleId</td>
* <td>long</td>
* </tr>
* <tr>
* <td>eventType</td>
* <td>int</td>
* </tr>
* <tr>
* <td>replay</td>
* <td>boolean</td>
* </tr>
* <tr>
* <td>timestamp</td>
* <td>long</td>
* </tr>
* <tr>
* <td>dependencies</td>
* <td>String[]</td>
* </tr>
* <tr>
* <td>exceptionMessage</td>
* <td>String</td>
* </tr>
* </table>
*/
public class OSGiBlueprintEvent implements TransferObject{
private long bundleId;
private long extenderBundleId;
private int eventType;
private boolean replay;
private long timestamp;
private String[] dependencies;
private String exceptionMessage;
/**
* Construct an OSGiBlueprintEvent from the supplied <link>BlueprintEvent</link>
*
* @param event
* - the event to represent
*/
public OSGiBlueprintEvent(BlueprintEvent event) {
this(event.getBundle().getBundleId(),
event.getExtenderBundle().getBundleId(),
event.getType(),
event.isReplay(),
event.getTimestamp(),
event.getDependencies(),
(event.getCause() == null) ? null : event.getCause().getMessage());
}
/**
* Construct an OSGiBlueprintEvent from the CompositeData representing the
* event
*
* @param data
* - the CompositeData representing the event.
*/
@SuppressWarnings("boxing")
public OSGiBlueprintEvent(CompositeData data) {
this((Long) data.get(BlueprintStateMBean.BUNDLE_ID),
(Long) data.get(BlueprintStateMBean.EXTENDER_BUNDLE_ID),
(Integer) data.get(BlueprintStateMBean.EVENT_TYPE),
(Boolean) data.get(BlueprintStateMBean.REPLAY),
(Long) data.get(BlueprintStateMBean.TIMESTAMP),
(String[]) data.get(BlueprintStateMBean.DEPENDENCIES),
(String) data.get(BlueprintStateMBean.EXCEPTION_MESSAGE));
}
/**
* Construct the OSGiBlueprintEvent
*
* @param bundleId
* @param extenderBundleId
* @param eventType
* @param replay
* @param timestamp
* @param dependencies
* @param exceptionMessage
*/
public OSGiBlueprintEvent(long bundleId, long extenderBundleId, int eventType, boolean replay, long timestamp, String[] dependencies, String exceptionMessage){
this.bundleId = bundleId;
this.extenderBundleId = extenderBundleId;
this.eventType = eventType;
this.replay = replay;
this.timestamp = timestamp;
this.dependencies = dependencies;
this.exceptionMessage = exceptionMessage;
}
/**
* Answer the receiver encoded as CompositeData
*
* @return the CompositeData encoding of the receiver.
*/
@SuppressWarnings("boxing")
public CompositeData asCompositeData() {
Map<String, Object> items = new HashMap<String, Object>();
items.put(BlueprintStateMBean.BUNDLE_ID, bundleId);
items.put(BlueprintStateMBean.EXTENDER_BUNDLE_ID, extenderBundleId);
items.put(BlueprintStateMBean.EVENT_TYPE, eventType);
items.put(BlueprintStateMBean.REPLAY, replay);
items.put(BlueprintStateMBean.TIMESTAMP, timestamp);
items.put(BlueprintStateMBean.DEPENDENCIES, dependencies);
items.put(BlueprintStateMBean.EXCEPTION_MESSAGE, exceptionMessage);
try {
return new CompositeDataSupport(BlueprintStateMBean.OSGI_BLUEPRINT_EVENT_TYPE, items);
} catch (OpenDataException e) {
throw new IllegalStateException("Cannot form blueprint event open data", e);
}
}
public long getBundleId() {
return bundleId;
}
public long getExtenderBundleId() {
return extenderBundleId;
}
public int getEventType() {
return eventType;
}
public boolean isReplay() {
return replay;
}
public long getTimestamp() {
return timestamp;
}
public String[] getDependencies() {
return dependencies;
}
public String getExceptionMessage() {
return exceptionMessage;
}
}