Beispiel #1
0
  @Override
  public int doStartTag() throws PageException {
    // if(timeoutInMillis==0)timeoutInMillis=30000;
    // print.out("doStartTag");
    manager = pageContext.getConfig().getLockManager();
    // check attributes
    if (name != null && scope != SCOPE_NONE) {
      throw new LockException(
          LockException.OPERATION_CREATE,
          this.name,
          "invalid attribute combination",
          "attribute [name] and [scope] can't be used together");
    }
    if (name == null && scope == SCOPE_NONE) {
      name = "id-" + id;
    }

    String lockType = null;
    if (name == null) {
      String cid = pageContext.getConfig().getIdentification().getId();
      // Session
      if (scope == SCOPE_REQUEST) {
        lockType = "request";
        name = "__request_" + cid + "__" + ((RequestImpl) pageContext.requestScope())._getId();
      }
      // Session
      else if (scope == SCOPE_SESSION) {
        lockType = "session";
        name = "__session_" + cid + "__" + pageContext.sessionScope()._getId();
      }
      // Application
      else if (scope == SCOPE_APPLICATION) {
        lockType = "application";
        name =
            "__application_"
                + cid
                + "__"
                + ((ApplicationImpl) pageContext.applicationScope())._getId();
      }
      // Server
      else if (scope == SCOPE_SERVER) {
        lockType = "server";
        name = "__server_" + ((ServerImpl) pageContext.serverScope())._getId();
      }
    }
    Struct cflock = new StructImpl();
    cflock.set("succeeded", Boolean.TRUE);
    cflock.set("errortext", "");
    pageContext.variablesScope().set("cflock", cflock);
    start = System.nanoTime();
    try {
      ((PageContextImpl) pageContext)
          .setActiveLock(
              new ActiveLock(
                  type,
                  name,
                  timeoutInMillis)); // this has to be first, otherwise LockTimeoutException has
                                     // nothing to release
      data = manager.lock(type, name, timeoutInMillis, pageContext.getId());
    } catch (LockTimeoutException e) {
      LockManagerImpl mi = (LockManagerImpl) manager;
      Boolean hasReadLock = mi.isReadLocked(name);
      Boolean hasWriteLock = mi.isWriteLocked(name);
      String msg =
          LockTimeoutExceptionImpl.createMessage(
              type, name, lockType, timeoutInMillis, hasReadLock, hasWriteLock);

      _release(pageContext, System.nanoTime() - start);
      name = null;

      cflock.set("succeeded", Boolean.FALSE);
      cflock.set("errortext", msg);

      if (throwontimeout) throw new LockException(LockException.OPERATION_TIMEOUT, this.name, msg);

      return SKIP_BODY;
    } catch (InterruptedException e) {
      _release(pageContext, System.nanoTime() - start);
      cflock.set("succeeded", Boolean.FALSE);
      cflock.set("errortext", e.getMessage());

      if (throwontimeout) throw Caster.toPageException(e);

      return SKIP_BODY;
    }

    return EVAL_BODY_INCLUDE;
  }