private void closeRemote() throws IOException { if (!remoteClosed) { final ManagementRequest<Void, Void> closeRequest = new AbstractManagementRequest<Void, Void>() { @Override public byte getOperationType() { return ModelControllerProtocol.CLOSE_INPUTSTREAM_REQUEST; } @Override protected void sendRequest(ActiveOperation.ResultHandler<Void> resultHandler, ManagementRequestContext<Void> context, FlushableDataOutput output) throws IOException { output.write(ModelControllerProtocol.PARAM_OPERATION); output.writeInt(batchId); output.write(ModelControllerProtocol.PARAM_INPUTSTREAM_INDEX); output.writeInt(index); } @Override public void handleRequest(DataInput input, ActiveOperation.ResultHandler<Void> resultHandler, ManagementRequestContext<Void> context) throws IOException { remoteClosed = true; } }; channelAssociation.executeRequest(closeRequest, null); } }
public TransactionalProtocolClientImpl(final ManagementChannelAssociation channelAssociation) { assert channelAssociation != null; this.channelAssociation = channelAssociation; final File temp = channelAssociation.getAttachments().getAttachment(ManagementChannelHandler.TEMP_DIR); if (temp != null && temp.isDirectory()) { tempDir = temp; } else { tempDir = javaTempDir; } }
@Override public <T extends Operation> AsyncFuture<ModelNode> execute(TransactionalOperationListener<T> listener, T operation) throws IOException { final ExecuteRequestContext context = new ExecuteRequestContext(new OperationWrapper<T>(listener, operation)); final ActiveOperation<ModelNode, ExecuteRequestContext> op = channelAssociation.initializeOperation(context, context); final AsyncFuture<ModelNode> result = new AbstractDelegatingAsyncFuture<ModelNode>(op.getResult()) { @Override public void asyncCancel(boolean interruptionDesired) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK)); } catch (Exception e) { throw new RuntimeException(e); } } }; context.initialize(result); channelAssociation.executeRequest(op, new ExecuteRequest()); return result; }
@Override public void handleRequest(final DataInput input, final ActiveOperation.ResultHandler<ModelNode> resultHandler, final ManagementRequestContext<Void> context) throws IOException { ControllerLogger.MGMT_OP_LOGGER.tracef("Handling ExecuteRequest for %d", context.getOperationId()); InetSocketAddress peerSocketAddress = channelAssociation.getChannel().getConnection().getPeerAddress(InetSocketAddress.class); final InetAddress remoteAddress = peerSocketAddress != null ? peerSocketAddress.getAddress() : null; final ModelNode operation = new ModelNode(); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_OPERATION); operation.readExternal(input); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_INPUTSTREAMS_LENGTH); final int attachmentsLength = input.readInt(); context.executeAsync(new ManagementRequestContext.AsyncTask<Void>() { @Override public void execute(final ManagementRequestContext<Void> context) throws Exception { final ManagementResponseHeader response = ManagementResponseHeader.create(context.getRequestHeader()); try { AccessAuditContext.doAs(connectionIdentity, remoteAddress, new PrivilegedExceptionAction<Void>() { @Override public Void run() throws Exception { final CompletedCallback callback = new CompletedCallback(response, context, resultHandler); doExecute(operation, attachmentsLength, context, callback); return null; } }); } catch (PrivilegedActionException e) { throw e.getException(); } } }, clientRequestExecutor); }
@Override public <T extends Operation> AsyncFuture<ModelNode> execute(TransactionalOperationListener<T> listener, T operation) throws IOException { final Subject subject = SecurityActions.getSubject(); final ExecuteRequestContext context = new ExecuteRequestContext(new OperationWrapper<T>(listener, operation), subject); final ActiveOperation<ModelNode, ExecuteRequestContext> op = channelAssociation.initializeOperation(context, context); final AsyncFuture<ModelNode> result = new AbstractDelegatingAsyncFuture<ModelNode>(op.getResult()) { @Override public void asyncCancel(boolean interruptionDesired) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK)); } catch (Exception e) { throw new RuntimeException(e); } } }; context.initialize(result); channelAssociation.executeRequest(op, new ExecuteRequest()); return result; }
@Override public void handleRequest(final DataInput input, final ActiveOperation.ResultHandler<ModelNode> resultHandler, final ManagementRequestContext<Void> context) throws IOException { ControllerLogger.MGMT_OP_LOGGER.tracef("Handling ExecuteRequest for %d", context.getOperationId()); InetSocketAddress peerSocketAddress = channelAssociation.getChannel().getConnection().getPeerAddress(InetSocketAddress.class); final InetAddress remoteAddress = peerSocketAddress != null ? peerSocketAddress.getAddress() : null; final ModelNode operation = new ModelNode(); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_OPERATION); operation.readExternal(input); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_INPUTSTREAMS_LENGTH); final int attachmentsLength = input.readInt(); context.executeAsync(new ManagementRequestContext.AsyncTask<Void>() { @Override public void execute(final ManagementRequestContext<Void> context) throws Exception { final ManagementResponseHeader response = ManagementResponseHeader.create(context.getRequestHeader()); try { AccessAuditContext.doAs(connectionIdentity, remoteAddress, new PrivilegedExceptionAction<Void>() { @Override public Void run() throws Exception { final CompletedCallback callback = new CompletedCallback(response, context, resultHandler); doExecute(operation, attachmentsLength, context, callback); return null; } }); } catch (PrivilegedActionException e) { throw e.getException(); } } }, clientRequestExecutor); }
@Override public void asyncCancel(boolean interruptionDesired) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK)); } catch (Exception e) { throw new RuntimeException(e); } } };
@Override public <T extends Operation> AsyncFuture<OperationResponse> execute(TransactionalOperationListener<T> listener, T operation) throws IOException { AccessAuditContext accessAuditContext = WildFlySecurityManager.isChecking() ? doPrivileged((PrivilegedAction<AccessAuditContext>) AccessAuditContext::currentAccessAuditContext) : AccessAuditContext.currentAccessAuditContext(); final ExecuteRequestContext context = new ExecuteRequestContext(new OperationWrapper<>(listener, operation), accessAuditContext != null ? accessAuditContext.getSecurityIdentity() : null, accessAuditContext != null ? accessAuditContext.getRemoteAddress() : null, tempDir, InVmAccess.isInVmCall()); final ActiveOperation<OperationResponse, ExecuteRequestContext> op = channelAssociation.initializeOperation(context, context); final AtomicBoolean cancelSent = new AtomicBoolean(); final AsyncFuture<OperationResponse> result = new AbstractDelegatingAsyncFuture<OperationResponse>(op.getResult()) { @Override public synchronized void asyncCancel(boolean interruptionDesired) { if (!cancelSent.get()) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK, channelAssociation)); cancelSent.set(true); } catch (IOException e) { throw new RuntimeException(e); } } } }; context.initialize(result); channelAssociation.executeRequest(op, new ExecuteRequest()); return result; }
public TransactionalProtocolClientImpl(final ManagementChannelAssociation channelAssociation) { assert channelAssociation != null; this.channelAssociation = channelAssociation; final File temp = channelAssociation.getAttachments().getAttachment(ManagementChannelHandler.TEMP_DIR); if (temp != null && temp.isDirectory()) { tempDir = temp; } else { tempDir = javaTempDir; } }
@Override public void asyncCancel(boolean interruptionDesired) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK)); } catch (Exception e) { throw new RuntimeException(e); } } };
@Override public <T extends Operation> AsyncFuture<OperationResponse> execute(TransactionalOperationListener<T> listener, T operation) throws IOException { AccessAuditContext accessAuditContext = WildFlySecurityManager.isChecking() ? doPrivileged((PrivilegedAction<AccessAuditContext>) AccessAuditContext::currentAccessAuditContext) : AccessAuditContext.currentAccessAuditContext(); final ExecuteRequestContext context = new ExecuteRequestContext(new OperationWrapper<>(listener, operation), accessAuditContext != null ? accessAuditContext.getSecurityIdentity() : null, accessAuditContext != null ? accessAuditContext.getRemoteAddress() : null, tempDir, InVmAccess.isInVmCall()); final ActiveOperation<OperationResponse, ExecuteRequestContext> op = channelAssociation.initializeOperation(context, context); final AtomicBoolean cancelSent = new AtomicBoolean(); final AsyncFuture<OperationResponse> result = new AbstractDelegatingAsyncFuture<OperationResponse>(op.getResult()) { @Override public synchronized void asyncCancel(boolean interruptionDesired) { if (!cancelSent.get()) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK, channelAssociation)); cancelSent.set(true); } catch (IOException e) { throw new RuntimeException(e); } } } }; context.initialize(result); channelAssociation.executeRequest(op, new ExecuteRequest()); return result; }
static ExecutableRequest parse(DataInput input, ManagementChannelAssociation channelAssociation) throws IOException { final ModelNode operation = new ModelNode(); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_OPERATION); operation.readExternal(input); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_INPUTSTREAMS_LENGTH); final int attachmentsLength = input.readInt(); final PropagatedIdentity propagatedIdentity; final Boolean readIdentity = channelAssociation.getAttachments().getAttachment(TransactionalProtocolClient.SEND_IDENTITY); propagatedIdentity = (readIdentity != null && readIdentity) ? read(input) : null; final Boolean readSendInVm = channelAssociation.getAttachments().getAttachment(TransactionalProtocolClient.SEND_IN_VM); boolean inVmCall = false; if (readSendInVm != null && readSendInVm) { ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_IN_VM_CALL); inVmCall = input.readBoolean(); } return new ExecutableRequest(operation, attachmentsLength, propagatedIdentity, inVmCall); } }
@Override public synchronized void asyncCancel(boolean interruptionDesired) { if (!cancelSent.get()) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK, channelAssociation)); cancelSent.set(true); } catch (IOException e) { throw new RuntimeException(e); } } } };
static ExecutableRequest parse(DataInput input, ManagementChannelAssociation channelAssociation) throws IOException { final ModelNode operation = new ModelNode(); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_OPERATION); operation.readExternal(input); ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_INPUTSTREAMS_LENGTH); final int attachmentsLength = input.readInt(); final PropagatedIdentity propagatedIdentity; final Boolean readIdentity = channelAssociation.getAttachments().getAttachment(TransactionalProtocolClient.SEND_IDENTITY); propagatedIdentity = (readIdentity != null && readIdentity) ? read(input) : null; final Boolean readSendInVm = channelAssociation.getAttachments().getAttachment(TransactionalProtocolClient.SEND_IN_VM); boolean inVmCall = false; if (readSendInVm != null && readSendInVm) { ProtocolUtils.expectHeader(input, ModelControllerProtocol.PARAM_IN_VM_CALL); inVmCall = input.readBoolean(); } return new ExecutableRequest(operation, attachmentsLength, propagatedIdentity, inVmCall); } }
@Override public synchronized void asyncCancel(boolean interruptionDesired) { if (!cancelSent.get()) { try { // Execute channelAssociation.executeRequest(op, new CompleteTxRequest(ModelControllerProtocol.PARAM_ROLLBACK, channelAssociation)); cancelSent.set(true); } catch (IOException e) { throw new RuntimeException(e); } } } };
final Boolean readSubject = channelAssociation.getAttachments().getAttachment(TransactionalProtocolClient.SEND_SUBJECT); if (readSubject != null && readSubject) { subject = readSubject(input);
@Override public void asyncCancel(boolean interruptionDesired) { try { getChannelAssociation().executeRequest(batchId, new CancelAsyncRequest()); } catch (Exception e) { throw new RuntimeException(e); } } }
@Override protected void sendRequest(final ActiveOperation.ResultHandler<ModelNode> resultHandler, final ManagementRequestContext<ExecuteRequestContext> context, final FlushableDataOutput output) throws IOException { // Write the operation final ExecuteRequestContext executionContext = context.getAttachment(); final List<InputStream> streams = executionContext.getInputStreams(); final ModelNode operation = executionContext.getOperation(); int inputStreamLength = 0; if (streams != null) { inputStreamLength = streams.size(); } output.write(ModelControllerProtocol.PARAM_OPERATION); operation.writeExternal(output); output.write(ModelControllerProtocol.PARAM_INPUTSTREAMS_LENGTH); output.writeInt(inputStreamLength); final Boolean sendSubject = channelAssociation.getAttachments().getAttachment(SEND_SUBJECT); if (sendSubject != null && sendSubject) { final Subject subject = context.getAttachment().getSerializableSubject(); writeSubject(output, subject); } }
@Override public void asyncCancel(boolean interruptionDesired) { try { getChannelAssociation().executeRequest(batchId, new CancelAsyncRequest()); } catch (Exception e) { throw new RuntimeException(e); } } }
@Override protected void sendRequest(final ActiveOperation.ResultHandler<OperationResponse> resultHandler, final ManagementRequestContext<ExecuteRequestContext> context, final FlushableDataOutput output) throws IOException { ControllerLogger.MGMT_OP_LOGGER.tracef("transmitting ExecuteRequest for %d", context.getOperationId()); // Write the operation final ExecuteRequestContext executionContext = context.getAttachment(); final List<InputStream> streams = executionContext.getInputStreams(); final ModelNode operation = executionContext.getOperation(); int inputStreamLength = 0; if (streams != null) { inputStreamLength = streams.size(); } output.write(ModelControllerProtocol.PARAM_OPERATION); operation.writeExternal(output); output.write(ModelControllerProtocol.PARAM_INPUTSTREAMS_LENGTH); output.writeInt(inputStreamLength); final Boolean sendIdentity = channelAssociation.getAttachments().getAttachment(SEND_IDENTITY); if (sendIdentity != null && sendIdentity) { ExecuteRequestContext attachment = context.getAttachment(); write(output, attachment.getSecurityIdentity(), attachment.getRemoteAddress()); } final Boolean sendInVm = channelAssociation.getAttachments().getAttachment(SEND_IN_VM); if (sendInVm != null && sendInVm) { ExecuteRequestContext attachment = context.getAttachment(); output.writeByte(ModelControllerProtocol.PARAM_IN_VM_CALL); output.writeBoolean(attachment.isInVmCall()); } }