/*
* 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.Map;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenDataException;
import org.apache.aries.jmx.blueprint.BlueprintMetadataMBean;
import org.osgi.service.blueprint.reflect.BeanArgument;
import org.osgi.service.blueprint.reflect.BeanMetadata;
import org.osgi.service.blueprint.reflect.BeanProperty;
public class BPBeanMetadata extends BPComponentMetadata implements BPTarget {
private String className;
private String destroyMethod;
private String factoryMethod;
private String initMethod;
private String scope;
private BPBeanArgument[] arguments;
private BPBeanProperty[] properties;
private BPTarget factoryComponent;
public BPBeanMetadata(CompositeData bean) {
super(bean);
className = (String) bean.get(BlueprintMetadataMBean.CLASS_NAME);
destroyMethod = (String) bean.get(BlueprintMetadataMBean.DESTROY_METHOD);
factoryMethod = (String) bean.get(BlueprintMetadataMBean.FACTORY_METHOD);
initMethod = (String) bean.get(BlueprintMetadataMBean.INIT_METHOD);
scope = (String) bean.get(BlueprintMetadataMBean.SCOPE);
Byte[] buf = (Byte[]) bean.get(BlueprintMetadataMBean.FACTORY_COMPONENT);
factoryComponent = (BPTarget) Util.boxedBinary2BPMetadata(buf);
CompositeData[] cd_args = (CompositeData[]) bean.get(BlueprintMetadataMBean.ARGUMENTS);
arguments = new BPBeanArgument[cd_args.length];
for (int i = 0; i < arguments.length; i++) {
arguments[i] = new BPBeanArgument(cd_args[i]);
}
CompositeData[] cd_props = (CompositeData[]) bean.get(BlueprintMetadataMBean.PROPERTIES);
properties = new BPBeanProperty[cd_props.length];
for (int i = 0; i < properties.length; i++) {
properties[i] = new BPBeanProperty(cd_props[i]);
}
}
public BPBeanMetadata(BeanMetadata bean) {
super(bean);
className = bean.getClassName();
destroyMethod = bean.getDestroyMethod();
factoryMethod = bean.getFactoryMethod();
initMethod = bean.getInitMethod();
scope = bean.getScope();
factoryComponent = (BPTarget) Util.metadata2BPMetadata(bean.getFactoryComponent());
arguments = new BPBeanArgument[bean.getArguments().size()];
int i = 0;
for (Object arg : bean.getArguments()) {
arguments[i++] = new BPBeanArgument((BeanArgument) arg);
}
properties = new BPBeanProperty[bean.getProperties().size()];
i = 0;
for (Object prop : bean.getProperties()) {
properties[i++] = new BPBeanProperty((BeanProperty) prop);
}
}
protected Map<String, Object> getItemsMap() {
Map<String, Object> items = super.getItemsMap();
// add its fields to the map
items.put(BlueprintMetadataMBean.CLASS_NAME, className);
items.put(BlueprintMetadataMBean.DESTROY_METHOD, destroyMethod);
items.put(BlueprintMetadataMBean.FACTORY_METHOD, factoryMethod);
items.put(BlueprintMetadataMBean.INIT_METHOD, initMethod);
items.put(BlueprintMetadataMBean.SCOPE, scope);
items.put(BlueprintMetadataMBean.FACTORY_COMPONENT, Util.bpMetadata2BoxedBinary(factoryComponent));
CompositeData[] cd_args = new CompositeData[arguments.length];
for (int i = 0; i < arguments.length; i++) {
cd_args[i] = arguments[i].asCompositeData();
}
items.put(BlueprintMetadataMBean.ARGUMENTS, cd_args);
CompositeData[] cd_props = new CompositeData[properties.length];
for (int i = 0; i < properties.length; i++) {
cd_props[i] = properties[i].asCompositeData();
}
items.put(BlueprintMetadataMBean.PROPERTIES, cd_props);
return items;
}
public CompositeData asCompositeData() {
try {
return new CompositeDataSupport(BlueprintMetadataMBean.BEAN_METADATA_TYPE, getItemsMap());
} catch (OpenDataException e) {
throw new RuntimeException(e);
}
}
public BPBeanArgument[] getArguments() {
return arguments;
}
public String getClassName() {
return className;
}
public String getDestroyMethod() {
return destroyMethod;
}
public BPTarget getFactoryComponent() {
return factoryComponent;
}
public String getFactoryMethod() {
return factoryMethod;
}
public String getInitMethod() {
return initMethod;
}
public BPBeanProperty[] getProperties() {
return properties;
}
public String getScope() {
return scope;
}
}