Package org.apache.imperius.cimspl

Source Code of org.apache.imperius.cimspl.CIMActuatorImpl

/*
* 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. 
*/


/**
* @author Prashant Baliga <prabalig@in.ibm.com>
*
*/



package org.apache.imperius.cimspl;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.imperius.spl.core.Actuator;
import org.apache.imperius.spl.core.Argument;
import org.apache.imperius.spl.parser.exceptions.InvalidCIMParameterException;
import org.apache.imperius.spl.parser.exceptions.SPLException;
import org.apache.imperius.util.SPLLogger;
import org.pegasus.jmpi.CIMClass;
import org.pegasus.jmpi.CIMDataType;
import org.pegasus.jmpi.CIMDateTime;
import org.pegasus.jmpi.CIMException;
import org.pegasus.jmpi.CIMInstance;
import org.pegasus.jmpi.CIMMethod;
import org.pegasus.jmpi.CIMOMHandle;
import org.pegasus.jmpi.CIMObjectPath;
import org.pegasus.jmpi.CIMParameter;
import org.pegasus.jmpi.CIMProperty;
import org.pegasus.jmpi.CIMValue;
import org.pegasus.jmpi.UnsignedInt16;
import org.pegasus.jmpi.UnsignedInt32;
import org.pegasus.jmpi.UnsignedInt64;
import org.pegasus.jmpi.UnsignedInt8;

public class CIMActuatorImpl implements Actuator
{

  private static CIMOMHandle handle      = null;
  private static final String sourceClass="ActuatorImpl";
  private static Logger logger = SPLLogger.getSPLLogger().getLogger();


  CIMActuatorImpl(CIMOMHandle ch)
  {
    handle=ch;
  }





  //instanceKeys is a Map containing (name,value) pairs,  inParameters and outParameters are maps that have (name,value) pairs which are the arguments for the method

  public Object invokeMethod(String className, String namespace,
      Object instance, String methodName,
      List inParameterValues) throws SPLException
      {
    logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "invokeMethod");

    Vector inParams=new Vector();
    Vector outParams=new Vector();
    CIMObjectPath cop=new CIMObjectPath(className,namespace);

    if(className!=null && namespace!=null)
    {
      try
      {

        Iterator it=inParameterValues.iterator();
        Map cimArgNameValuePairs= new HashMap();
        while(it.hasNext())
        {
          Argument arg=(Argument)it.next();
          cimArgNameValuePairs.put(arg.getName(), arg.getValue());
          //System.out.println(" added to cimArgNameValuePairs : "+arg.getName()+ " "+arg.getValue().toString());
        }

        if(instance instanceof CIMObjectPath)
        {
          cop=(CIMObjectPath)instance;
          CIMObjectPath classCop=new CIMObjectPath(className,namespace);
          CIMClass cimclass=handle.getClass(classCop, true, true, true, null);

          CIMMethod cimMethod= cimclass.getMethod(methodName);
          inParams=getMethodInputParams(cimMethod, cimArgNameValuePairs);
          if(logger.isLoggable(Level.FINE))
            logger.fine(Thread.currentThread().getName()+" Actuator::invokeMethod:invoking method "+methodName);

          CIMObjectPath instanceCop=new CIMObjectPath(className,namespace);
          instanceCop.setKeys(cop.getKeys());

          //System.out.println("cop, methodName :"+instanceCop+" "+ methodName);
          CIMValue cv=handle.invokeMethod(instanceCop, methodName, inParams, outParams);
          //System.out.println("invokeMethod complete : return value="+cv.getValue());
          if(logger.isLoggable(Level.FINE))
            logger.fine(Thread.currentThread().getName()+" Actuator::invokeMethod:done invoking method");
          if(logger.isLoggable(Level.FINE))
            logger.fine(outParams.toString());
          logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "invokeMethod");
          //Integer returnVal=new Integer(1);
          return cv.getValue();

        }
        else{
          logger.severe(Thread.currentThread().getName()+" "+"instance for method invokation is not of type CIMObjectPath");
          throw new SPLException("instance for method invokation is not of type CIMObjectPath");

        }
      }
      catch(CIMException e){
        e.printStackTrace();
        //System.out.println(e.getMessage());
        logger.severe(Thread.currentThread().getName()+" "+"invokeMethod Failed "+methodName+"  "+ className+ "  " + namespace+" "+e.getMessage());
        throw new SPLException("invokeMethod Failed"+methodName+"  "+ className+ "  " + namespace +" "+ e.getMessage());
      }
    }
    else {
      logger.severe(Thread.currentThread().getName()+" "+"This CIM class is not handled by the Policy Provider");
      throw new InvalidCIMParameterException("This CIM class is not handled by the Policy Provider");
   


      }


  //_className, qualifier, instance, modifiedProperties
  public void modifyInstance(String className,String namespace,Object instance, Map properties) throws SPLException {
    logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "modifyInstance");
    if(className!=null && namespace!=null){
      try{
        if(instance instanceof CIMObjectPath)
        {
          CIMObjectPath copTemp=(CIMObjectPath)instance;
          CIMObjectPath cop=new CIMObjectPath(className,namespace);
          cop.setKeys(copTemp.getKeys());


          if(logger.isLoggable(Level.FINE))
            logger.fine(Thread.currentThread().getName()+" Actuator::Modify instance :cop"+cop);

          CIMInstance cimInstance= null;
          try{
            cimInstance=handle.getInstance(cop, true, true, true, null);
          }
          catch(CIMException e){
            logger.severe(Thread.currentThread().getName()+" "+"instance does not belong to Anchor Class, might be of an extension of Anchor class, no action will be taken on it. "+e.getMessage());
            throw new SPLException("instance does not belong to Anchor Class, might be of an extension of Anchor class, no action will be taken on it. "+e.getMessage());

          }
          if(cimInstance != null){

            if(logger.isLoggable(Level.FINE))
              logger.fine(Thread.currentThread().getName()+" done setting all properties");
            Vector instanceProperties=generateModifiedPropertiesVector(cimInstance, properties);
            cimInstance.setProperty(instanceProperties);
            handle.modifyInstance(cop, cimInstance, true, null);
            if(logger.isLoggable(Level.FINE))
              logger.fine(Thread.currentThread().getName()+" done modifying CIMInstance");
            logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "modifyInstance");
          }
        }
        else
        {

          logger.severe(Thread.currentThread().getName()+" "+"instance for method invokation is not of type CIMObjectPath");
          throw new SPLException("instance for method invokation is not of type CIMObjectPath");
        }

      }
      catch(CIMException e){
        e.printStackTrace();
        logger.severe(Thread.currentThread().getName()+" "+"modify instance Failed :"+ className+ "  " + namespace);
        throw new SPLException("modify Instance Failed :"+ className+ "  " + namespace);
      }
    }
    else {
      logger.severe(Thread.currentThread().getName()+" "+"This CIM class is not handled by the Policy Provider");
      throw new InvalidCIMParameterException("This CIM class is not handled by the Policy Provider");
   

  }


  public void init(CIMOMHandle ch) throws SPLException {
    logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "init");
    handle=ch;
    logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "init");


  }
  /* (non-Javadoc)
   * @see com.ibm.pegasus.cimspl.helper.DataCollector#shutDown()
   */
  public void shutDown() {
    logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "init");
    logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "init");

  }

  private CIMValue getCIMObjectOfGivenType(int type, boolean isArray, Object CIMKeyValue) throws CIMException,SPLException
  {
    CIMValue cimval=null;
    if(isArray){

      if(type==CIMDataType.UINT8_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List uintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Short sht=new Short(Short.parseShort((arrayIt.next()).toString()));
          UnsignedInt8 uint8= new UnsignedInt8(sht.shortValue());
          uintArray.add(uint8);
        }
        Object actualValue=(UnsignedInt8[])uintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }
      if(type==CIMDataType.UINT16_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List uintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Integer integ=new Integer(Integer.parseInt((arrayIt.next()).toString()));
          UnsignedInt16 uint16= new UnsignedInt16(integ.intValue());
          uintArray.add(uint16);
        }
        Object actualValue=(UnsignedInt16[])uintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }
      if(type==CIMDataType.UINT32_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List uintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Long lng=new Long(Long.parseLong((arrayIt.next()).toString()));
          UnsignedInt32 uint32= new UnsignedInt32(lng.longValue());
          uintArray.add(uint32);
        }
        Object actualValue=(UnsignedInt32[])uintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }
      if(type==CIMDataType.UINT64_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List uintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Long lng=new Long(Long.parseLong((arrayIt.next()).toString()));
          BigInteger big=BigInteger.valueOf(lng.longValue());
          UnsignedInt64 uint64= new UnsignedInt64(big.abs());
          uintArray.add(uint64);
        }
        Object actualValue=(UnsignedInt64[])uintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }
      if(type==CIMDataType.SINT8_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Byte bt=new Byte(Byte.parseByte((arrayIt.next()).toString()));
          sintArray.add(bt);
        }
        Object actualValue=(Byte[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.SINT16_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Short bt=new Short(Short.parseShort((arrayIt.next()).toString()));
          sintArray.add(bt);
        }
        Object actualValue=(Short[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }
      if(type==CIMDataType.SINT32_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Integer bt=new Integer(Integer.parseInt((arrayIt.next()).toString()));
          sintArray.add(bt);
        }
        Object actualValue=(Integer[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.SINT64_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Long bt=new Long(Long.parseLong((arrayIt.next()).toString()));
          sintArray.add(bt);
        }
        Object actualValue=(Long[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.REAL32_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Float bt=new Float(Float.parseFloat((arrayIt.next()).toString()));
          sintArray.add(bt);
        }
        Object actualValue=(Float[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.REAL64_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Double bt=new Double(Double.parseDouble((arrayIt.next()).toString()));
          sintArray.add(bt);
        }
        Object actualValue=(Double[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.BOOLEAN_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Boolean bt=Boolean.valueOf((arrayIt.next()).toString());
          sintArray.add(bt);
        }
        Object actualValue=(Boolean[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }
      if(type==CIMDataType.CHAR16_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          Character bt=new Character(((arrayIt.next()).toString()).charAt(0));
          sintArray.add(bt);
        }
        Object actualValue=(Character[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.STRING_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List sintArray=new ArrayList();
        while(arrayIt.hasNext()){
          String bt=(arrayIt.next()).toString();
          sintArray.add(bt);
        }
        Object actualValue=(String[])sintArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }

      if(type==CIMDataType.DATETIME_ARRAY){
        if(!(CIMKeyValue instanceof List)){
          logger.severe(Thread.currentThread().getName()+" "+"expected a List");
          throw new SPLException("expected a List");
        }
        List intArray=(List)CIMKeyValue;
        Iterator arrayIt=intArray.iterator();
        List cimDateTimeArray=new ArrayList();
        while(arrayIt.hasNext()){
          Object ob=arrayIt.next();
          if(!(ob instanceof Calendar)){
            throw new SPLException("Value should be of type Calendar");
          }
          Calendar cal=(Calendar)ob;
          CIMDateTime calCIM=new CIMDateTime(cal.getTime());
          cimDateTimeArray.add(calCIM);
        }
        Object actualValue=(CIMDateTime[])cimDateTimeArray.toArray();
        cimval=new CIMValue(actualValue);                   
      }



    }else{
      if(type==CIMDataType.UINT8){
        Short sht=new Short(Short.parseShort(CIMKeyValue.toString()));
        UnsignedInt8 uint8= new UnsignedInt8(sht.shortValue());
        cimval=new CIMValue(uint8);
      }
      if(type==CIMDataType.UINT16){
        Integer integ=new Integer(Integer.parseInt(CIMKeyValue.toString()));
        UnsignedInt16 uint16= new UnsignedInt16(integ.intValue());
        cimval=new CIMValue(uint16);
      }
      if(type==CIMDataType.UINT32){
        Long lng=new Long(Long.parseLong(CIMKeyValue.toString()));
        UnsignedInt32 uint32= new UnsignedInt32(lng.longValue());
        cimval=new CIMValue(uint32);
      }
      if(type==CIMDataType.UINT64){
        Long shrt=new Long(Long.parseLong(CIMKeyValue.toString()));
        BigInteger big=BigInteger.valueOf(shrt.longValue());
        UnsignedInt64 uint64= new UnsignedInt64(big.abs());
        cimval=new CIMValue(uint64);
      }
      if(type==CIMDataType.SINT8){
        Byte byt=new Byte(Byte.parseByte(CIMKeyValue.toString()));
        cimval=new CIMValue(byt);
      }
      if(type==CIMDataType.SINT16){
        Short sht=new Short(Short.parseShort(CIMKeyValue.toString()));
        cimval=new CIMValue(sht);
      }
      if(type==CIMDataType.SINT32){
        Integer integ=new Integer(Integer.parseInt(CIMKeyValue.toString()));
        cimval=new CIMValue(integ);
      }
      if(type==CIMDataType.SINT64){
        Long lng=new Long(Long.parseLong(CIMKeyValue.toString()));
        cimval=new CIMValue(lng);
      }
      if(type==CIMDataType.REAL32){
        Float flt=new Float(Float.parseFloat(CIMKeyValue.toString()));
        cimval=new CIMValue(flt);
      }
      if(type==CIMDataType.REAL64){
        Double dbl=new Double(Double.parseDouble(CIMKeyValue.toString()));
        cimval=new CIMValue(dbl);
      }
      if(type==CIMDataType.CHAR16){
        Character cha=new Character((CIMKeyValue.toString()).charAt(0));
        cimval=new CIMValue(cha);
      }
      if(type==CIMDataType.BOOLEAN){
        Boolean booln=Boolean.valueOf(CIMKeyValue.toString());
        cimval=new CIMValue(booln);
      }
      if(type==CIMDataType.STRING){
        String str=CIMKeyValue.toString();
        cimval=new CIMValue(str);
      }
      if(type==CIMDataType.DATETIME){
        if(!(CIMKeyValue instanceof Calendar)){
          throw new SPLException("Value should be of type Calendar");
        }
        Calendar cal=(Calendar)CIMKeyValue;
        CIMDateTime calCIM=new CIMDateTime(cal.getTime());
        cimval=new CIMValue(calCIM);
      }

    }
    return cimval;
  }


  private Vector generateModifiedPropertiesVector(CIMInstance cimInstance,Map properties) throws SPLException {
    logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "generateModifiedPropertiesList");

    Vector instanceProperties=cimInstance.getProperties();
    Set propertyNames=properties.keySet();
    Iterator propertyIterator=propertyNames.iterator();
    while(propertyIterator.hasNext()){
      String keyName=(String)propertyIterator.next();
      Object KeyValue=properties.get(keyName);
      Iterator instancePropertyIterator=instanceProperties.iterator();

      while(instancePropertyIterator.hasNext()){
        CIMProperty cimprop=(CIMProperty)instancePropertyIterator.next();
        String name=cimprop.getName();
        int type=cimprop.getType().getType();
        boolean isArray=cimprop.isArray();
        CIMValue instValue=cimprop.getValue();
        if(cimprop.getName().equalsIgnoreCase(keyName)){
          Object CIMKeyValue=KeyValue;
          if(logger.isLoggable(Level.FINE))
            logger.fine(Thread.currentThread().getName()+" Instance property:: Name,Type,Value,CIMKeyValue :"+name+" "+type+" "+instValue+" "+CIMKeyValue.getClass());
          try{


            CIMValue cimval=getCIMObjectOfGivenType(type, isArray, CIMKeyValue);


            cimprop.setValue(cimval);
            if(logger.isLoggable(Level.FINE))
              logger.fine(Thread.currentThread().getName()+" cimprop set to cimValue "+cimval.getValue());

          }
          catch(CIMException e){
            e.printStackTrace();
            //System.out.println(e.getMessage());
            logger.severe(Thread.currentThread().getName()+" "+"generateModifiedPropertiesVector Failed ");
            throw new SPLException("generateModifiedPropertiesVector Failed");

          }
        }

      }       

    }

    logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "generateModifiedPropertiesList");

    return instanceProperties;
  }

  private Vector getMethodInputParams(CIMMethod cimMethod, Map cimArgNameValuePairs) throws SPLException {
    logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "generateModifiedPropertiesList");
    Vector inParams=new Vector();
    for( int j=0; j<cimMethod.getParameterCount(); j++)
    {
      try{
        CIMParameter cimparameter=cimMethod.getParameter(j);
        String parameterName=cimparameter.getName();
        int type=cimparameter.getType().getType();
        boolean isArray=cimparameter.isArray();
        //System.out.println("parameter name = "+parameterName);
        Object paramValue=cimArgNameValuePairs.get(parameterName);

        if(paramValue!=null)
        {
          CIMValue cv=getCIMObjectOfGivenType(type, isArray, paramValue);
          //System.out.println("parameter value = "+paramValue+ " "+cv.toString());
          inParams.add(new CIMProperty(parameterName,cv));
        }
        else
        {
          //System.out.println("value = null");
        }
      }
      catch(CIMException e){
        e.printStackTrace();
        //System.out.println(e.getMessage());
        logger.severe(Thread.currentThread().getName()+" "+"getMethodInputParams Failed ");
        throw new SPLException("getMethodInputParams Failed");

      }

    }

    return inParams;
  }

}
TOP

Related Classes of org.apache.imperius.cimspl.CIMActuatorImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.