Package org.openengsb.core.console.internal.util

Source Code of org.openengsb.core.console.internal.util.ServicesHelper

/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you 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 org.openengsb.core.console.internal.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.Callable;

import org.apache.felix.service.command.CommandProcessor;
import org.apache.felix.service.command.CommandSession;
import org.apache.shiro.subject.ExecutionException;
import org.openengsb.core.api.ConnectorManager;
import org.openengsb.core.api.ConnectorProvider;
import org.openengsb.core.api.Constants;
import org.openengsb.core.api.Domain;
import org.openengsb.core.api.DomainProvider;
import org.openengsb.core.api.descriptor.AttributeDefinition;
import org.openengsb.core.api.descriptor.ServiceDescriptor;
import org.openengsb.core.api.model.ConnectorDescription;
import org.openengsb.core.console.internal.ServiceCommands;
import org.openengsb.core.services.SecurityContext;
import org.openengsb.core.util.Comparators;
import org.openengsb.core.util.DefaultOsgiUtilsService;
import org.openengsb.core.util.OutputStreamFormater;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

public class ServicesHelper {

    private DefaultOsgiUtilsService osgiUtilsService;
    private ConnectorManager serviceManager;
    private InputStream keyboard;
    private BundleContext bundleContext;

    public ServicesHelper() {
    }

    public void init() {
        osgiUtilsService = new DefaultOsgiUtilsService();
        osgiUtilsService.setBundleContext(bundleContext);
        serviceManager = osgiUtilsService.getService(ConnectorManager.class);
        CommandProcessor commandProcessor =
            osgiUtilsService.getService(org.apache.felix.service.command.CommandProcessor.class);
        CommandSession commandSession = commandProcessor.createSession(System.in, System.err, System.out);
        keyboard = commandSession.getKeyboard();
    }

    /**
     * prints out all available services and their alive state
     */
    public void listRunningServices() {
        try {
            final List<String> formatedOutput =
                SecurityContext.executeWithSystemPermissions(new Callable<List<String>>() {
                    @Override
                    public List<String> call() throws Exception {
                        List<String> tmp = new ArrayList<String>();

                        List<ServiceReference<Domain>> listServiceReferences =
                            osgiUtilsService.listServiceReferences(Domain.class);
                        for (ServiceReference<Domain> ref : listServiceReferences) {
                            Domain service = bundleContext.getService(ref);
                            tmp.add(OutputStreamFormater.formatValues(
                                ref.getProperty(org.osgi.framework.Constants.SERVICE_PID).toString(), service
                                    .getAliveState().toString()));
                        }
                        return tmp;
                    }
                });
            for (String s : formatedOutput) {
                OutputStreamFormater.printValue(s);
            }
        } catch (ExecutionException ex) {
            ex.printStackTrace();
            System.err.println("Could not get services");
        }
    }

    public List<DomainProvider> getDomainProvider() {
        List<DomainProvider> domainProvider = osgiUtilsService.listServices(DomainProvider.class);
        Collections.sort(domainProvider, Comparators.forDomainProvider());
        return domainProvider;
    }

    public List<String> getDomainProviderNames() {
        List<String> names = new ArrayList<String>();
        List<DomainProvider> domainProvider = getDomainProvider();
        for (DomainProvider provider : domainProvider) {
            String name = provider.getName().getString(Locale.getDefault());
            names.add(name);
        }
        return names;
    }

    /**
     * delete a service identified by its id, if force is true, the user does not have to confirm
     */
    public void deleteService(String id, boolean force) {
        try {
            if (id == null || id.isEmpty()) {
                id = selectRunningService();
            }
            final String idFinal = id;
            int input = 'Y';
            if (!force) {
                OutputStreamFormater.printValue(String.format(
                    "Do you really want to delete the connector: %s (Y/n): ", id));
                input = keyboard.read();
            }
            if ('n' != (char) input && 'N' != (char) input) {
                SecurityContext.executeWithSystemPermissions(new Callable<Object>() {
                    @Override
                    public Object call() throws Exception {
                        serviceManager.delete(idFinal);
                        return null;
                    }
                });
                OutputStreamFormater.printValue(String.format("Service: %s successfully deleted", id));
            }
        } catch (ExecutionException e) {
            e.printStackTrace();
            System.err.println("Could not delete service");
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("Unexpected Error");
        }
    }

    /**
     * let the user chose one of the running services
     *
     * @return
     */
    private String selectRunningService() {
        String selectedServiceId;
        List<String> runningServiceIds = getRunningServiceIds();
        for (int i = 0; i < runningServiceIds.size(); i++) {
            String serviceId = runningServiceIds.get(i);
            OutputStreamFormater.printTabbedValues(9, String.format("[%s]", i), String.format("%s", serviceId));
        }
        String s = readUserInput();
        int pos;
        try {
            pos = Integer.parseInt(s);
            selectedServiceId = runningServiceIds.get(pos);
        } catch (Exception e) {
            throw new IllegalArgumentException(String.format("Invalid Input: %s", s));
        }
        return selectedServiceId;

    }

    /**
     * returns a list of all service ids
     */
    public List<String> getRunningServiceIds() {
        List<ServiceReference<Domain>> serviceReferences = osgiUtilsService.listServiceReferences(Domain.class);
        List<String> result = new ArrayList<String>();
        for (ServiceReference<Domain> ref : serviceReferences) {
            result.add((String) ref.getProperty(org.osgi.framework.Constants.SERVICE_PID));
        }
        return result;
    }

    /**
     * crate a service for the given domain, if force is true, input is not verified
     */
    public void createService(String domainProviderName, boolean force, Map<String, String> attributes) {
        // check if a domain has been chosen
        if (domainProviderName == null || domainProviderName.isEmpty()) {
            domainProviderName = selectDomainProvider();
        }

        // get domain provider Id
        String domainProviderId = "";
        List<DomainProvider> domainProvider = getDomainProvider();
        for (DomainProvider provider : domainProvider) {
            if (provider.getName().getString(Locale.getDefault()).equals(domainProviderName)) {
                domainProviderId = provider.getId();
            }
        }
        // get the connector which should be created
        ConnectorProvider connectorProvider =
            getConnectorToCreate(domainProviderId, attributes.get(ServiceCommands.CONNECTOR_TYPE));

        String id;
        if (attributes.isEmpty() || !attributes.containsKey(org.osgi.framework.Constants.SERVICE_PID)) {
            OutputStreamFormater.printValue("Please enter an ID");
            id = readUserInput();
        } else {
            id = attributes.get(org.osgi.framework.Constants.SERVICE_PID);
        }

        ServiceDescriptor descriptor = connectorProvider.getDescriptor();
        OutputStreamFormater.printValue(String.format("Please enter the attributes for %s, keep empty for default",
            descriptor.getName().getString(Locale.getDefault())));

        // get attributes for connector
        Map<String, String> attributeMap = getConnectorAttributes(descriptor.getAttributes(), attributes);
        Map<String, Object> properties = new HashMap<String, Object>();

        ConnectorDescription connectorDescription =
            new ConnectorDescription(domainProviderId, connectorProvider.getId(), attributeMap, properties);
        if (force) {
            if (id != null && !id.isEmpty()) {
                serviceManager.forceCreateWithId(id, connectorDescription);
            } else {
                serviceManager.forceCreate(connectorDescription);
            }
            OutputStreamFormater.printValue("Connector successfully created");
        } else {
            OutputStreamFormater.printValue("Do you want to create the connector with the following attributes:", "");
            OutputStreamFormater.printValue("Connector ID", id);
            for (String key : attributeMap.keySet()) {
                OutputStreamFormater.printValue(key, attributeMap.get(key));
            }
            OutputStreamFormater.printValue("Create connector: (Y/n)");
            if (!readUserInput().equalsIgnoreCase("n")) {
                try {
                    if (id != null && !id.isEmpty()) {
                        serviceManager.createWithId(id, connectorDescription);
                    } else {
                        serviceManager.create(connectorDescription);
                    }
                    OutputStreamFormater.printValue("Connector successfully created");
                } catch (RuntimeException e) {
                    e.printStackTrace();
                    OutputStreamFormater.printValue("Connector validation failed, creation aborted");
                }
            } else {
                OutputStreamFormater.printValue("Creation aborted");
            }
        }
    }

    private String selectDomainProvider() {
        String selectedProvider = "";
        List<String> domainProviderNames = getDomainProviderNames();
        for (int i = 0; i < domainProviderNames.size(); i++) {
            String provider = domainProviderNames.get(i);
            OutputStreamFormater.printTabbedValues(9, String.format("[%s]", i), String.format("%s", provider));
        }
        String s = readUserInput();
        int pos;
        try {
            pos = Integer.parseInt(s);
            selectedProvider = domainProviderNames.get(pos);
        } catch (Exception e) {
            throw new IllegalArgumentException(String.format("Invalid Input: %s", s));
        }
        return selectedProvider;
    }

    protected Map<String, String> getConnectorAttributes(List<AttributeDefinition> attributeDefinitions,
            Map<String, String> attributesFromInput) {
        HashMap<String, String> attributeMap = new HashMap<String, String>();
        for (AttributeDefinition attributeDefinition : attributeDefinitions) {
            String fieldName = attributeDefinition.getName().getString(Locale.getDefault());
            String description = attributeDefinition.getDescription().getString(Locale.getDefault());
            String defaultValue = attributeDefinition.getDefaultValue().getString(Locale.getDefault());

            String userValue;
            if (attributesFromInput.containsKey(attributeDefinition.getId())) {
                userValue = attributesFromInput.get(attributeDefinition.getId());
            } else {
                OutputStreamFormater.printTabbedValues(9, String.format("\n%s", fieldName),
                    String.format("%s (%s)", description, defaultValue));
                if (!attributeDefinition.getOptions().isEmpty()) {
                    userValue = letUserChooseFromOption(attributeDefinition.getOptions());
                } else {
                    userValue = readUserInput();
                }
                if ("".equals(userValue) || "\n".equals(userValue)) {
                    userValue = defaultValue;
                }
            }
            attributeMap.put(fieldName, userValue);
        }
        return attributeMap;
    }

    private String letUserChooseFromOption(List<AttributeDefinition.Option> options) {
        for (int i = 0; i < options.size(); i++) {
            AttributeDefinition.Option option = options.get(i);
            OutputStreamFormater.printTabbedValues(9, String.format("[%s]", i),
                String.format("%s (%s)", option.getLabel().getString(Locale.getDefault()), option.getValue()));
        }
        String s = readUserInput();
        int pos;
        try {
            pos = Integer.parseInt(s);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException(String.format("Invalid input %s", s));
        }
        return options.get(pos).getValue();
    }

    private ConnectorProvider getConnectorToCreate(String domainProviderId, String connector) {
        List<ConnectorProvider> connectorProviders =
            osgiUtilsService.listServices(ConnectorProvider.class,
                String.format("(%s=%s)", Constants.DOMAIN_KEY, domainProviderId));

        for (ConnectorProvider connectorProvider : connectorProviders) {
            if (connector != null && connector.equals(connectorProvider.getId())) {
                return connectorProvider;
            }
        }

        OutputStreamFormater.printValue("Please select the connector you want to create: ");
        Collections.sort(connectorProviders, Comparators.forConnectorProvider());
        for (int i = 0; i < connectorProviders.size(); i++) {
            ConnectorProvider connectorProvider = connectorProviders.get(i);
            ServiceDescriptor descriptor = connectorProvider.getDescriptor();
            OutputStreamFormater.printTabbedValues(9, String.format("[%s] %s", i,
                descriptor.getName().getString(Locale.getDefault())),
                descriptor.getDescription().getString(Locale.getDefault()));
        }
        String positionString = readUserInput();
        int pos;
        try {
            pos = Integer.parseInt(positionString);
        } catch (NumberFormatException e) {
            System.err.println("Invalid Input");
            return null;
        }
        return connectorProviders.get(pos);
    }

    private String readUserInput() {
        String positionString = "";
        try {
            int read = keyboard.read();
            while (read != '\n') {
                if (read == 127) { // backspace
                    int lastPos = positionString.length() - 1;
                    positionString = positionString.substring(0, lastPos >= 0 ? lastPos : 0);
                    System.out.println("\n" + positionString);
                    System.out.flush();
                } else {
                    char read1 = (char) read;
                    System.out.print(read1);
                    System.out.flush();
                    positionString += read1;
                }
                read = keyboard.read();
            }
            OutputStreamFormater.printValue("\n");
            System.out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return positionString;
    }

    public void setOsgiUtilsService(DefaultOsgiUtilsService osgiUtilsService) {
        this.osgiUtilsService = osgiUtilsService;
    }

    public BundleContext getBundleContext() {
        return bundleContext;
    }

    public void setBundleContext(BundleContext bundleContext) {
        this.bundleContext = bundleContext;
    }

}
TOP

Related Classes of org.openengsb.core.console.internal.util.ServicesHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.