/**
   * Sets the instance of CheckedActionFactory.
   *
   * @param instance an Object that implements CheckedActionFactory, or null.
   */
  public void setCheckedActionFactory(CheckedActionFactory instance) {
    synchronized (this) {
      CheckedActionFactory oldInstance = this.checkedActionFactory;
      checkedActionFactory = instance;

      if (instance == null) {
        this.checkedActionFactoryClassName = null;
      } else if (instance != oldInstance) {
        String name = ClassloadingUtility.getNameForClass(instance);
        this.checkedActionFactoryClassName = name;
      }
    }
  }
  /**
   * Returns an instance of a class implementing CheckedActionFactory.
   *
   * <p>If there is no pre-instantiated instance set and classloading or instantiation fails, this
   * method will log appropriate warning and return null, not throw an exception.
   *
   * @return a CheckedActionFactory implementation instance, or null.
   */
  public CheckedActionFactory getCheckedActionFactory() {
    if (checkedActionFactory == null && checkedActionFactoryClassName != null) {
      synchronized (this) {
        if (checkedActionFactory == null && checkedActionFactoryClassName != null) {
          try {
            CheckedActionFactory instance =
                ClassloadingUtility.loadAndInstantiateClass(
                    CheckedActionFactory.class, checkedActionFactoryClassName, null);
            checkedActionFactory = instance;
          } catch (final java.lang.RuntimeException ex) // todo android
          {
            if (Utility.isAndroid()) checkedActionFactory = new CheckedActionFactoryImple();
            else throw ex;
          }
        }
      }
    }

    return checkedActionFactory;
  }
예제 #3
0
  public boolean restore_state(InputObjectState os, int t) {
    boolean res = false;

    try {
      _heuristic = os.unpackInt();
      _committed = os.unpackBoolean();

      _tranID = XidImple.unpack(os);

      _theXAResource = null;
      _recoveryObject = null;

      if (os.unpackInt() == RecoverableXAConnection.OBJECT_RECOVERY) {
        _productName = os.unpackString();
        _productVersion = os.unpackString();
        _jndiName = os.unpackString();

        boolean haveXAResource = os.unpackBoolean();

        if (haveXAResource) {
          try {
            // Read the classname of the serialized XAResource
            String className = os.unpackString();

            byte[] b = os.unpackBytes();

            ByteArrayInputStream s = new ByteArrayInputStream(b);
            ObjectInputStream o = new ObjectInputStream(s);

            // Give the list of deserializers a chance to deserialize the record
            boolean deserialized = false;
            Iterator<SerializableXAResourceDeserializer> iterator =
                getXAResourceDeserializers().iterator();
            while (iterator.hasNext()) {
              SerializableXAResourceDeserializer proxyXAResourceDeserializer = iterator.next();
              if (proxyXAResourceDeserializer.canDeserialze(className)) {
                _theXAResource = proxyXAResourceDeserializer.deserialze(o);
                deserialized = true;
                break;
              }
            }

            // Give it a go ourselves
            if (!deserialized) {
              _theXAResource = (XAResource) o.readObject();
            }
            o.close();

            if (jtaLogger.logger.isTraceEnabled()) {
              jtaLogger.logger.trace("XAResourceRecord.restore_state - XAResource de-serialized");
            }
          } catch (Exception ex) {
            // not serializable in the first place!

            jtaLogger.i18NLogger.warn_resources_arjunacore_restorestate(ex);

            return false;
          }
        } else {
          /*
           * Lookup new XAResource via XARecoveryModule if possible.
           */

          _theXAResource = getNewXAResource();

          if (_theXAResource == null) {
            jtaLogger.i18NLogger.warn_resources_arjunacore_norecoveryxa(toString());

            /*
             * Don't prevent tx from activating because there may be
             * other participants that can still recover. Plus, we will
             * try to get a new XAResource later for this instance.
             */

            res = true;
          }
        }
      } else {
        String creatorName = os.unpackString();

        _recoveryObject =
            ClassloadingUtility.loadAndInstantiateClass(
                RecoverableXAConnection.class, creatorName, null);
        if (_recoveryObject == null) {
          throw new ClassNotFoundException();
        }

        _recoveryObject.unpackFrom(os);
        _theXAResource = _recoveryObject.getResource();

        if (jtaLogger.logger.isTraceEnabled()) {
          jtaLogger.logger.trace(
              "XAResourceRecord.restore_state - XAResource got from " + creatorName);
        }
      }

      res = true;
    } catch (Exception e) {
      jtaLogger.i18NLogger.warn_resources_arjunacore_restorestateerror(
          _theXAResource.toString(), XAHelper.xidToString(_tranID), e);

      res = false;
    }

    if (res) res = super.restore_state(os, t);

    return res;
  }