org.talend.components.netsuite.NetSuiteComponentDefinition.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.components.netsuite.NetSuiteComponentDefinition.java

Source

// ============================================================================
//
// Copyright (C) 2006-2017 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================

package org.talend.components.netsuite;

import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.talend.components.api.component.AbstractComponentDefinition;
import org.talend.components.api.component.runtime.DependenciesReader;
import org.talend.components.api.component.runtime.ExecutionEngine;
import org.talend.components.api.component.runtime.JarRuntimeInfo;
import org.talend.components.api.exception.ComponentException;
import org.talend.components.api.properties.ComponentProperties;
import org.talend.components.netsuite.connection.NetSuiteConnectionProperties;
import org.talend.daikon.java8.Function;
import org.talend.daikon.properties.ValidationResult;
import org.talend.daikon.properties.property.Property;
import org.talend.daikon.runtime.RuntimeInfo;
import org.talend.daikon.runtime.RuntimeUtil;
import org.talend.daikon.sandbox.SandboxedInstance;

/**
 *
 */
public abstract class NetSuiteComponentDefinition extends AbstractComponentDefinition {

    public static final String MAVEN_GROUP_ID = "org.talend.components";

    public static final String MAVEN_ARTIFACT_ID = "netsuite-runtime_${version}";

    public static final String SOURCE_OR_SINK_CLASS = "org.talend.components.netsuite.v${version}.NetSuiteSourceOrSinkImpl";

    public static final String SOURCE_CLASS = "org.talend.components.netsuite.v${version}.NetSuiteSourceImpl";

    public static final String SINK_CLASS = "org.talend.components.netsuite.v${version}.NetSuiteSinkImpl";

    public static final String RUNTIME_CLASS = "org.talend.components.netsuite.v${version}.NetSuiteRuntimeImpl";

    protected NetSuiteComponentDefinition(String componentName, ExecutionEngine engine1,
            ExecutionEngine... engines) {
        super(componentName, engine1, engines);
    }

    @Override
    public String[] getFamilies() {
        return new String[] { "Business/NetSuite", "Cloud/NetSuite" };
    }

    @SuppressWarnings("unchecked")
    @Override
    public Class<? extends ComponentProperties>[] getNestedCompatibleComponentPropertiesClass() {
        return new Class[] { NetSuiteConnectionProperties.class };
    }

    @Override
    // Most of the components are on the input side, so put this here, the output definition will override this
    public Property[] getReturnProperties() {
        return new Property[] { RETURN_ERROR_MESSAGE_PROP, RETURN_TOTAL_RECORD_COUNT_PROP };
    }

    public static <R> R withDatasetRuntime(final NetSuiteProvideConnectionProperties properties,
            final Function<NetSuiteDatasetRuntime, R> func) {
        return withRuntime(properties, new Function<NetSuiteRuntime, R>() {
            @Override
            public R apply(NetSuiteRuntime runtime) {
                NetSuiteConnectionProperties connectionProperties = properties.getConnectionProperties();
                NetSuiteDatasetRuntime dataSetRuntime = runtime.getDatasetRuntime(connectionProperties);
                return func.apply(dataSetRuntime);
            }
        });
    }

    public static <R> R withRuntime(final NetSuiteProvideConnectionProperties properties,
            final Function<NetSuiteRuntime, R> func) {
        RuntimeInfo runtimeInfo = getRuntimeInfo(properties, RUNTIME_CLASS);
        try (SandboxedInstance sandboxI = RuntimeUtil.createRuntimeClass(runtimeInfo,
                NetSuiteComponentDefinition.class.getClassLoader())) {
            NetSuiteConnectionProperties connectionProperties = properties.getConnectionProperties();
            NetSuiteRuntime runtime = (NetSuiteRuntime) sandboxI.getInstance();
            runtime.setContext(connectionProperties.getDesignTimeContext());
            return func.apply(runtime);
        }
    }

    public static RuntimeInfo getRuntimeInfo(final NetSuiteProvideConnectionProperties properties,
            final String runtimeClassName) {

        NetSuiteConnectionProperties connectionProperties = properties.getConnectionProperties();

        String endpointUrl = StringUtils.strip(connectionProperties.endpoint.getStringValue(), "\"");
        String apiVersion = detectApiVersion(endpointUrl);

        String artifactId = MAVEN_ARTIFACT_ID.replace("${version}", apiVersion);
        String className = runtimeClassName.replace("${version}", apiVersion);

        return new JarRuntimeInfo("mvn:" + MAVEN_GROUP_ID + "/" + artifactId,
                DependenciesReader.computeDependenciesFilePath(MAVEN_GROUP_ID, artifactId), className);
    }

    public static String detectApiVersion(String nsEndpointUrl) {
        URI uri = URI.create(nsEndpointUrl);
        if (uri.getPath().endsWith("NetSuitePort_2016_2")) {
            return "2016_2";
        }
        if (uri.getPath().endsWith("NetSuitePort_2014_2")) {
            return "2014_2";
        }
        throw new ComponentException(new ValidationResult().setStatus(ValidationResult.Result.ERROR)
                .setMessage("Failed to detect NetSuite API version: " + nsEndpointUrl));
    }

    public static class DesignTimeContext implements NetSuiteRuntime.Context {
        protected Map<String, Object> attributes = new HashMap<>();

        @Override
        public boolean isCachingEnabled() {
            return true;
        }

        @Override
        public Object getAttribute(String key) {
            return attributes.get(key);
        }

        @Override
        public void setAttribute(String key, Object value) {
            attributes.put(key, value);
        }
    }

}