/* * 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; } }