com.evolveum.midpoint.cli.ninja.action.Action.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.cli.ninja.action.Action.java

Source

/*
 * Copyright (c) 2010-2015 Evolveum
 *
 * Licensed 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 com.evolveum.midpoint.cli.ninja.action;

import com.beust.jcommander.JCommander;
import com.evolveum.midpoint.cli.common.ToolsUtils;
import com.evolveum.midpoint.cli.ninja.command.Command;
import com.evolveum.midpoint.cli.ninja.util.ClientPasswordHandler;
import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectDeltaListType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;
import com.evolveum.midpoint.xml.ns._public.common.fault_3.FaultMessage;
import com.evolveum.midpoint.xml.ns._public.common.fault_3.FaultType;
import com.evolveum.midpoint.xml.ns._public.model.model_3.ModelPortType;
import com.evolveum.midpoint.xml.ns._public.model.model_3.ModelService;
import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType;
import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType;
import org.apache.commons.lang.Validate;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.handler.WSHandlerConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import java.util.Map;

/**
 * @author lazyman
 */
public abstract class Action<T extends Command> {

    protected Logger STD_OUT = LoggerFactory.getLogger(ToolsUtils.LOGGER_SYS_OUT);
    protected Logger STD_ERR = LoggerFactory.getLogger(ToolsUtils.LOGGER_SYS_ERR);

    private JCommander commander;
    private T params;

    public Action(T params, JCommander commander) {
        Validate.notNull(params, "Action parameters must not be null.");
        Validate.notNull(commander, "Commander must not be null.");

        this.params = params;
        this.commander = commander;
    }

    public T getParams() {
        return params;
    }

    public void execute() throws Exception {
        if (params.isHelp()) {
            StringBuilder sb = new StringBuilder();
            commander.usage(commander.getParsedCommand(), sb);

            STD_OUT.info(sb.toString());

            return;
        }

        executeAction();
    }

    protected abstract void executeAction() throws Exception;

    protected ModelPortType createModelPort() {
        ModelService modelService = new ModelService();
        ModelPortType port = modelService.getModelPort();
        BindingProvider bp = (BindingProvider) port;

        Client client = ClientProxy.getClient(port);
        Endpoint endpoint = client.getEndpoint();
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = http.getClient();
        if (httpClientPolicy == null) {
            httpClientPolicy = new HTTPClientPolicy();
            http.setClient(httpClientPolicy);
        }

        httpClientPolicy.setConnectionTimeout(10000);

        Map<String, Object> requestContext = bp.getRequestContext();
        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, params.getUrl().toString());

        requestContext.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        requestContext.put(WSHandlerConstants.USER, params.getUsername());
        requestContext.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);

        ClientPasswordHandler handler = new ClientPasswordHandler();
        handler.setPassword(params.getInsertedPassword());
        requestContext.put(WSHandlerConstants.PW_CALLBACK_REF, handler);

        WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(requestContext);
        endpoint.getOutInterceptors().add(wssOut);
        if (params.isVerbose()) {
            endpoint.getOutInterceptors().add(new LoggingOutInterceptor());
            endpoint.getInInterceptors().add(new LoggingInInterceptor());
        }

        return port;
    }

    protected ObjectDeltaType createDeleteDelta(String oid, QName type) {
        ObjectDeltaType delta = new ObjectDeltaType();
        delta.setOid(oid);
        delta.setChangeType(ChangeTypeType.DELETE);
        if (type == null) {
            type = com.evolveum.midpoint.cli.ninja.util.ObjectType.OBJECT.getType();
        }
        delta.setObjectType(type);

        return delta;
    }

    protected ObjectDeltaType createAddDelta(ObjectType object) {
        ObjectDeltaType delta = new ObjectDeltaType();
        delta.setChangeType(ChangeTypeType.ADD);
        delta.setObjectToAdd(object);

        return delta;
    }

    protected ObjectDeltaListType createDeltaList(ObjectDeltaType... deltas) {
        ObjectDeltaListType list = new ObjectDeltaListType();
        for (ObjectDeltaType delta : deltas) {
            list.getDelta().add(delta);
        }
        return list;
    }

    protected void handleError(String message, Exception ex) throws Exception {
        STD_ERR.info(message);
        STD_ERR.info("Error occurred: {}", ex.getMessage());

        if (ex instanceof FaultMessage) {
            FaultMessage faultMessage = (FaultMessage) ex;
            FaultType fault = faultMessage.getFaultInfo();
            if (fault != null && fault.getOperationResult() != null) {
                OperationResultType result = fault.getOperationResult();
                STD_ERR.info("Operation result: {}", result.getMessage());

                if (getParams().isVerbose()) {
                    try {
                        STD_ERR.debug(ToolsUtils.serializeObject(result));
                    } catch (JAXBException e) {
                        STD_ERR.debug("Couldn't serialize operation result, reason: {}", e.getMessage());
                    }
                }
            }
        }

        if (getParams().isVerbose()) {
            STD_ERR.debug("Error details", ex);
        }

        throw ex;
    }
}