content: /*
   * 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.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import javax.management.openmbean.CompositeData;
  
  import org.apache.aries.jmx.blueprint.BlueprintMetadataMBean;
  import org.osgi.service.blueprint.reflect.BeanMetadata;
  import org.osgi.service.blueprint.reflect.CollectionMetadata;
  import org.osgi.service.blueprint.reflect.IdRefMetadata;
  import org.osgi.service.blueprint.reflect.MapMetadata;
  import org.osgi.service.blueprint.reflect.Metadata;
  import org.osgi.service.blueprint.reflect.NullMetadata;
  import org.osgi.service.blueprint.reflect.PropsMetadata;
  import org.osgi.service.blueprint.reflect.RefMetadata;
  import org.osgi.service.blueprint.reflect.ReferenceListMetadata;
  import org.osgi.service.blueprint.reflect.ReferenceMetadata;
  import org.osgi.service.blueprint.reflect.ServiceMetadata;
  import org.osgi.service.blueprint.reflect.ValueMetadata;
  
  public class Util {
  
      public static BPMetadata metadata2BPMetadata(Metadata metadata) {
          if(null == metadata)
              return null;
          // target first
          if (metadata instanceof BeanMetadata)
              return new BPBeanMetadata((BeanMetadata) metadata);
  
          if (metadata instanceof ReferenceMetadata)
              return new BPReferenceMetadata((ReferenceMetadata) metadata);
  
          if (metadata instanceof RefMetadata)
              return new BPRefMetadata((RefMetadata) metadata);
  
          // others
          if (metadata instanceof CollectionMetadata)
              return new BPCollectionMetadata((CollectionMetadata) metadata);
  
          if (metadata instanceof ServiceMetadata)
              return new BPServiceMetadata((ServiceMetadata) metadata);
  
          if (metadata instanceof ReferenceListMetadata)
              return new BPReferenceListMetadata((ReferenceListMetadata) metadata);
  
          if (metadata instanceof IdRefMetadata)
              return new BPIdRefMetadata((IdRefMetadata) metadata);
  
          if (metadata instanceof MapMetadata)
              return new BPMapMetadata((MapMetadata) metadata);
  
          if (metadata instanceof PropsMetadata)
              return new BPPropsMetadata((PropsMetadata) metadata);
  
          if (metadata instanceof ValueMetadata)
              return new BPValueMetadata((ValueMetadata) metadata);
  
          // null last
          if (metadata instanceof NullMetadata)
              return new BPNullMetadata((NullMetadata) metadata);
  
          throw new RuntimeException("Unknown metadata type");
      }
  
      public static BPMetadata binary2BPMetadata(byte[] buf) {
          if(null == buf)
              return null;
  
          ByteArrayInputStream inBytes = new ByteArrayInputStream(buf);
          ObjectInputStream inObject;
          CompositeData metadata;
          try {
              inObject = new ObjectInputStream(inBytes);
              metadata = (CompositeData) inObject.readObject();
              inObject.close();
          } catch (IOException e) {
              throw new RuntimeException(e);
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
              return null;
          }
  
          String typename = metadata.getCompositeType().getTypeName();
  
          // target first
          if (typename.equals(BlueprintMetadataMBean.BEAN_METADATA))
              return new BPBeanMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.REFERENCE_METADATA))
              return new BPReferenceMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.REF_METADATA))
              return new BPRefMetadata(metadata);
  
          // others
          if (typename.equals(BlueprintMetadataMBean.COLLECTION_METADATA))
              return new BPCollectionMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.SERVICE_METADATA))
              return new BPServiceMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.REFERENCE_LIST_METADATA))
              return new BPReferenceListMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.ID_REF_METADATA))
              return new BPIdRefMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.MAP_METADATA))
              return new BPMapMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.PROPS_METADATA))
              return new BPPropsMetadata(metadata);
  
          if (typename.equals(BlueprintMetadataMBean.VALUE_METADATA))
              return new BPValueMetadata(metadata);
  
          // null last
          if (metadata instanceof NullMetadata)
              return new BPNullMetadata(metadata);
  
          throw new RuntimeException("Unknown metadata type");
      }
  
      public static byte[] bpMetadata2Binary(BPMetadata metadata) {
          if(null == metadata)
              return null;
  
          ByteArrayOutputStream outBytes = new ByteArrayOutputStream();
          ObjectOutputStream outObject;
          try {
              outObject = new ObjectOutputStream(outBytes);
              outObject.writeObject(metadata.asCompositeData());
              outObject.close();
          } catch (IOException e) {// there is no io op
              throw new RuntimeException(e);
          }
  
          return outBytes.toByteArray();
      }
      public static Byte[] bpMetadata2BoxedBinary(BPMetadata metadata)
      {
          if(null == metadata)
              return null;
  
          byte [] src = bpMetadata2Binary(metadata);
          Byte [] res = new Byte[src.length];
          for(int i=0;i<src.length;i++)
          {
              res[i] = src[i];
          }
          return res;
      }
      public static BPMetadata boxedBinary2BPMetadata(Byte[] buf) {
          if(null == buf)
              return null;
  
          byte [] unbox = new byte[buf.length];
          for(int i=0;i<buf.length;i++)
          {
              unbox[i] = buf[i];
          }
          return binary2BPMetadata(unbox);
      }
  }
  