Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1628D17B15 for ; Thu, 3 Sep 2015 02:16:42 +0000 (UTC) Received: (qmail 25303 invoked by uid 500); 3 Sep 2015 02:16:42 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 25230 invoked by uid 500); 3 Sep 2015 02:16:41 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 24992 invoked by uid 99); 3 Sep 2015 02:16:41 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Sep 2015 02:16:41 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8BE19E7E2E; Thu, 3 Sep 2015 02:16:41 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: akuznetsov@apache.org To: commits@ignite.apache.org Date: Thu, 03 Sep 2015 02:16:47 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [07/15] ignite git commit: IGNITE-1357: Moved bootstrap logic to Ignite. IGNITE-1357: Moved bootstrap logic to Ignite. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/61aad3c3 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/61aad3c3 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/61aad3c3 Branch: refs/heads/ignite-843 Commit: 61aad3c32cd5823e355f4492eda359e6ff060263 Parents: 86ab3a7 Author: vozerov-gridgain Authored: Wed Sep 2 15:17:47 2015 +0300 Committer: vozerov-gridgain Committed: Wed Sep 2 15:17:47 2015 +0300 ---------------------------------------------------------------------- ...processors.platform.PlatformBootstrapFactory | 2 + .../PlatformAbstractConfigurationClosure.java | 61 +++++ .../platform/PlatformConfigurationEx.java | 48 ++++ .../platform/cpp/PlatformCppBootstrap.java | 31 +++ .../cpp/PlatformCppBootstrapFactory.java | 39 +++ .../cpp/PlatformCppConfigurationClosure.java | 99 +++++++ .../cpp/PlatformCppConfigurationEx.java | 82 ++++++ .../dotnet/PlatformDotNetBootstrap.java | 31 +++ .../dotnet/PlatformDotNetBootstrapFactory.java | 39 +++ .../PlatformDotNetConfigurationClosure.java | 255 +++++++++++++++++++ .../dotnet/PlatformDotNetConfigurationEx.java | 91 +++++++ .../platform/utils/PlatformUtils.java | 14 + 12 files changed, 792 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/META-INF/services/org.apache.ignite.internal.processors.platform.PlatformBootstrapFactory ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/META-INF/services/org.apache.ignite.internal.processors.platform.PlatformBootstrapFactory b/modules/platform/src/main/java/META-INF/services/org.apache.ignite.internal.processors.platform.PlatformBootstrapFactory new file mode 100644 index 0000000..7f015e7 --- /dev/null +++ b/modules/platform/src/main/java/META-INF/services/org.apache.ignite.internal.processors.platform.PlatformBootstrapFactory @@ -0,0 +1,2 @@ +org.apache.ignite.internal.processors.platform.cpp.PlatformCppBootstrapFactory +org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetBootstrapFactory \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractConfigurationClosure.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractConfigurationClosure.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractConfigurationClosure.java new file mode 100644 index 0000000..2f7af71 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractConfigurationClosure.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform; + +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway; +import org.apache.ignite.lang.IgniteClosure; + +/** + * Abstract interop configuration closure. + */ +public abstract class PlatformAbstractConfigurationClosure + implements IgniteClosure { + /** */ + private static final long serialVersionUID = 0L; + + /** Native gateway. */ + protected final PlatformCallbackGateway gate; + + /** + * Constructor. + * + * @param envPtr Environment pointer. + */ + protected PlatformAbstractConfigurationClosure(long envPtr) { + this.gate = new PlatformCallbackGateway(envPtr); + } + + /** {@inheritDoc} */ + @Override public IgniteConfiguration apply(IgniteConfiguration igniteCfg) { + assert igniteCfg != null; + + IgniteConfiguration igniteCfg0 = new IgniteConfiguration(igniteCfg); + + apply0(igniteCfg0); + + return igniteCfg0; + } + + /** + * Internal apply routine. + * + * @param igniteCfg Ignite configuration. + */ + protected abstract void apply0(IgniteConfiguration igniteCfg); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformConfigurationEx.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformConfigurationEx.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformConfigurationEx.java new file mode 100644 index 0000000..66eff8b --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/PlatformConfigurationEx.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform; + +import org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway; +import org.apache.ignite.internal.processors.platform.memory.PlatformMemoryManagerImpl; + +import java.util.Collection; + +/** + * Extended platform configuration. + */ +public interface PlatformConfigurationEx { + /* + * @return Native gateway. + */ + public PlatformCallbackGateway gate(); + + /** + * @return Memory manager. + */ + public PlatformMemoryManagerImpl memory(); + + /** + * @return Platform name. + */ + public String platform(); + + /** + * @return Warnings to be displayed on grid start. + */ + public Collection warnings(); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrap.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrap.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrap.java new file mode 100644 index 0000000..d066296 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrap.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.cpp; + +import org.apache.ignite.internal.processors.platform.PlatformAbstractBootstrap; +import org.apache.ignite.internal.processors.platform.PlatformAbstractConfigurationClosure; + +/** + * Platform .Net bootstrap. + */ +public class PlatformCppBootstrap extends PlatformAbstractBootstrap { + /** {@inheritDoc} */ + @Override protected PlatformAbstractConfigurationClosure closure(long envPtr) { + return new PlatformCppConfigurationClosure(envPtr); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrapFactory.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrapFactory.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrapFactory.java new file mode 100644 index 0000000..4933713 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppBootstrapFactory.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.cpp; + +import org.apache.ignite.internal.processors.platform.PlatformBootstrap; +import org.apache.ignite.internal.processors.platform.PlatformBootstrapFactory; + +/** + * Platform .Net bootstrap factory. + */ +public class PlatformCppBootstrapFactory implements PlatformBootstrapFactory { + /** Bootstrap ID. */ + public static final int ID = 2; + + /** {@inheritDoc} */ + @Override public int id() { + return ID; + } + + /** {@inheritDoc} */ + @Override public PlatformBootstrap create() { + return new PlatformCppBootstrap(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationClosure.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationClosure.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationClosure.java new file mode 100644 index 0000000..648726b --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationClosure.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.cpp; + +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.PlatformConfiguration; +import org.apache.ignite.internal.processors.platform.PlatformAbstractConfigurationClosure; +import org.apache.ignite.internal.processors.platform.memory.PlatformMemoryManagerImpl; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.marshaller.portable.PortableMarshaller; +import org.apache.ignite.platform.cpp.PlatformCppConfiguration; + +import java.util.Collections; + +/** + * Interop CPP configuration closure. + */ +public class PlatformCppConfigurationClosure extends PlatformAbstractConfigurationClosure { + /** */ + private static final long serialVersionUID = 0L; + + /** + * Constructor. + * + * @param envPtr Environment pointer. + */ + public PlatformCppConfigurationClosure(long envPtr) { + super(envPtr); + } + + /** {@inheritDoc} */ + @SuppressWarnings("deprecation") + @Override protected void apply0(IgniteConfiguration igniteCfg) { + // 3. Validate and copy Interop configuration setting environment pointer along the way. + PlatformConfiguration interopCfg = igniteCfg.getPlatformConfiguration(); + + if (interopCfg != null && !(interopCfg instanceof PlatformCppConfiguration)) + throw new IgniteException("Illegal interop configuration (must be of type " + + PlatformCppConfiguration.class.getName() + "): " + interopCfg.getClass().getName()); + + PlatformCppConfiguration cppCfg = interopCfg != null ? (PlatformCppConfiguration)interopCfg : null; + + if (cppCfg == null) + cppCfg = new PlatformCppConfiguration(); + + PlatformMemoryManagerImpl memMgr = new PlatformMemoryManagerImpl(gate, 1024); + + PlatformCppConfigurationEx cppCfg0 = new PlatformCppConfigurationEx(cppCfg, gate, memMgr); + + igniteCfg.setPlatformConfiguration(cppCfg0); + + // Check marshaller + Marshaller marsh = igniteCfg.getMarshaller(); + + if (marsh == null) { + igniteCfg.setMarshaller(new PortableMarshaller()); + + cppCfg0.warnings(Collections.singleton("Marshaller is automatically set to " + + PortableMarshaller.class.getName() + " (other nodes must have the same marshaller type).")); + } + else if (!(marsh instanceof PortableMarshaller)) + throw new IgniteException("Unsupported marshaller (only " + PortableMarshaller.class.getName() + + " can be used when running Ignite for C++): " + marsh.getClass().getName()); + + // Set Ignite home so that marshaller context works. + String ggHome = igniteCfg.getIgniteHome(); + + if (ggHome == null) + ggHome = U.getIgniteHome(); + else + // If user provided IGNITE_HOME - set it as a system property. + U.setIgniteHome(ggHome); + + try { + U.setWorkDirectory(igniteCfg.getWorkDirectory(), ggHome); + } + catch (IgniteCheckedException e) { + throw U.convertException(e); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationEx.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationEx.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationEx.java new file mode 100644 index 0000000..ea11ce9 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/cpp/PlatformCppConfigurationEx.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.cpp; + +import org.apache.ignite.internal.processors.platform.PlatformConfigurationEx; +import org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway; +import org.apache.ignite.internal.processors.platform.memory.PlatformMemoryManagerImpl; +import org.apache.ignite.internal.processors.platform.utils.PlatformUtils; +import org.apache.ignite.platform.cpp.PlatformCppConfiguration; + +import java.util.Collection; + +/** + * Internal interop CPP configuration. + */ +public class PlatformCppConfigurationEx extends PlatformCppConfiguration implements PlatformConfigurationEx { + /** Native gateway. */ + private final PlatformCallbackGateway gate; + + /** Memory manager. */ + private final PlatformMemoryManagerImpl memMgr; + + /** Warnings */ + private Collection warns; + + /** + * Copy constructor. + * + * @param cfg Configuration to copy. + * @param gate Native gateway. + * @param memMgr Memory manager. + */ + public PlatformCppConfigurationEx(PlatformCppConfiguration cfg, PlatformCallbackGateway gate, + PlatformMemoryManagerImpl memMgr) { + super(cfg); + + this.gate = gate; + this.memMgr = memMgr; + } + + /** {@inheritDoc} */ + @Override public PlatformCallbackGateway gate() { + return gate; + } + + /** {@inheritDoc} */ + @Override public PlatformMemoryManagerImpl memory() { + return memMgr; + } + + /** {@inheritDoc} */ + @Override public String platform() { + return PlatformUtils.PLATFORM_CPP; + } + + /** {@inheritDoc} */ + @Override public Collection warnings() { + return warns; + } + + /** + * @param warnings Warnings. + */ + public void warnings(Collection warnings) { + this.warns = warnings; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrap.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrap.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrap.java new file mode 100644 index 0000000..837ded9 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrap.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.dotnet; + +import org.apache.ignite.internal.processors.platform.PlatformAbstractBootstrap; +import org.apache.ignite.internal.processors.platform.PlatformAbstractConfigurationClosure; + +/** + * Interop .Net bootstrap. + */ +public class PlatformDotNetBootstrap extends PlatformAbstractBootstrap { + /** {@inheritDoc} */ + @Override protected PlatformAbstractConfigurationClosure closure(long envPtr) { + return new PlatformDotNetConfigurationClosure(envPtr); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrapFactory.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrapFactory.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrapFactory.java new file mode 100644 index 0000000..6b2a6cd --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetBootstrapFactory.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.dotnet; + +import org.apache.ignite.internal.processors.platform.PlatformBootstrap; +import org.apache.ignite.internal.processors.platform.PlatformBootstrapFactory; + +/** + * Interop .Net bootstrap factory. + */ +public class PlatformDotNetBootstrapFactory implements PlatformBootstrapFactory { + /** Bootstrap ID. */ + public static final int ID = 1; + + /** {@inheritDoc} */ + @Override public int id() { + return ID; + } + + /** {@inheritDoc} */ + @Override public PlatformBootstrap create() { + return new PlatformDotNetBootstrap(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java new file mode 100644 index 0000000..56351e6 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationClosure.java @@ -0,0 +1,255 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.dotnet; + +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.PlatformConfiguration; +import org.apache.ignite.internal.MarshallerContextImpl; +import org.apache.ignite.internal.portable.GridPortableMarshaller; +import org.apache.ignite.internal.portable.PortableContext; +import org.apache.ignite.internal.portable.PortableMetaDataHandler; +import org.apache.ignite.internal.portable.PortableRawWriterEx; +import org.apache.ignite.internal.processors.platform.PlatformAbstractConfigurationClosure; +import org.apache.ignite.internal.processors.platform.lifecycle.PlatformLifecycleBean; +import org.apache.ignite.internal.processors.platform.memory.PlatformInputStream; +import org.apache.ignite.internal.processors.platform.memory.PlatformMemory; +import org.apache.ignite.internal.processors.platform.memory.PlatformMemoryManagerImpl; +import org.apache.ignite.internal.processors.platform.memory.PlatformOutputStream; +import org.apache.ignite.internal.processors.platform.utils.PlatformUtils; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lifecycle.LifecycleBean; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.marshaller.portable.PortableMarshaller; +import org.apache.ignite.platform.dotnet.PlatformDotNetConfiguration; +import org.apache.ignite.platform.dotnet.PlatformDotNetLifecycleBean; +import org.apache.ignite.portable.PortableException; +import org.apache.ignite.portable.PortableMetadata; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Closure to apply dot net configuration. + */ +@SuppressWarnings({"UnusedDeclaration"}) +public class PlatformDotNetConfigurationClosure extends PlatformAbstractConfigurationClosure { + /** */ + private static final long serialVersionUID = 0L; + + /** Configuration. */ + private IgniteConfiguration cfg; + + /** Memory manager. */ + private PlatformMemoryManagerImpl memMgr; + + /** + * Constructor. + * + * @param envPtr Environment pointer. + */ + public PlatformDotNetConfigurationClosure(long envPtr) { + super(envPtr); + } + + /** {@inheritDoc} */ + @SuppressWarnings("deprecation") + @Override protected void apply0(IgniteConfiguration igniteCfg) { + // 3. Validate and copy Interop configuration setting environment pointer along the way. + PlatformConfiguration interopCfg = igniteCfg.getPlatformConfiguration(); + + if (interopCfg != null && !(interopCfg instanceof PlatformDotNetConfiguration)) + throw new IgniteException("Illegal platform configuration (must be of type " + + PlatformDotNetConfiguration.class.getName() + "): " + interopCfg.getClass().getName()); + + PlatformDotNetConfiguration dotNetCfg = interopCfg != null ? (PlatformDotNetConfiguration)interopCfg : null; + + if (dotNetCfg == null) + dotNetCfg = new PlatformDotNetConfiguration(); + + memMgr = new PlatformMemoryManagerImpl(gate, 1024); + + PlatformDotNetConfigurationEx dotNetCfg0 = new PlatformDotNetConfigurationEx(dotNetCfg, gate, memMgr); + + igniteCfg.setPlatformConfiguration(dotNetCfg0); + + // Check marshaller + Marshaller marsh = igniteCfg.getMarshaller(); + + if (marsh == null) { + igniteCfg.setMarshaller(new PortableMarshaller()); + + dotNetCfg0.warnings(Collections.singleton("Marshaller is automatically set to " + + PortableMarshaller.class.getName() + " (other nodes must have the same marshaller type).")); + } + else if (!(marsh instanceof PortableMarshaller)) + throw new IgniteException("Unsupported marshaller (only " + PortableMarshaller.class.getName() + + " can be used when running Ignite for .Net): " + marsh.getClass().getName()); + + // Set Ignite home so that marshaller context works. + String ggHome = igniteCfg.getIgniteHome(); + + if (ggHome == null) + ggHome = U.getIgniteHome(); + else + // If user provided IGNITE_HOME - set it as a system property. + U.setIgniteHome(ggHome); + + try { + U.setWorkDirectory(igniteCfg.getWorkDirectory(), ggHome); + } + catch (IgniteCheckedException e) { + throw U.convertException(e); + } + + // 4. Callback to .Net. + prepare(igniteCfg, dotNetCfg0); + } + + /** + * Prepare .Net size. + * + * @param igniteCfg Ignite configuration. + * @param interopCfg Interop configuration. + */ + @SuppressWarnings("ConstantConditions") + private void prepare(IgniteConfiguration igniteCfg, PlatformDotNetConfigurationEx interopCfg) { + this.cfg = igniteCfg; + + try (PlatformMemory outMem = memMgr.allocate()) { + try (PlatformMemory inMem = memMgr.allocate()) { + PlatformOutputStream out = outMem.output(); + + PortableRawWriterEx writer = marshaller().writer(out); + + writer.writeObject(interopCfg.unwrap()); + + List beans = beans(igniteCfg); + + writer.writeInt(beans.size()); + + for (PlatformDotNetLifecycleBean bean : beans) { + writer.writeString(bean.getAssemblyName()); + writer.writeString(bean.getClassName()); + writer.writeMap(bean.getProperties()); + } + + out.synchronize(); + + gate.extensionCallbackInLongLongOutLong( + PlatformUtils.OP_PREPARE_DOT_NET, outMem.pointer(), inMem.pointer()); + + processPrepareResult(inMem.input()); + } + } + } + + /** + * Process prepare result. + * + * @param in Input stream. + */ + private void processPrepareResult(PlatformInputStream in) { + assert cfg != null; + + List beans = beans(cfg); + List newBeans = new ArrayList<>(); + + int len = in.readInt(); + + for (int i = 0; i < len; i++) { + if (i < beans.size()) + // Existing bean. + beans.get(i).initialize(gate, in.readLong()); + else + // This bean is defined in .Net. + newBeans.add(new PlatformLifecycleBean(gate, in.readLong())); + } + + if (!newBeans.isEmpty()) { + LifecycleBean[] newBeans0 = newBeans.toArray(new LifecycleBean[newBeans.size()]); + + // New beans were added. Let's append them to the tail of the rest configured lifecycle beans. + LifecycleBean[] oldBeans = cfg.getLifecycleBeans(); + + if (oldBeans == null) + cfg.setLifecycleBeans(newBeans0); + else { + LifecycleBean[] mergedBeans = new LifecycleBean[oldBeans.length + newBeans.size()]; + + System.arraycopy(oldBeans, 0, mergedBeans, 0, oldBeans.length); + System.arraycopy(newBeans0, 0, mergedBeans, oldBeans.length, newBeans0.length); + + cfg.setLifecycleBeans(mergedBeans); + } + } + } + + /** + * Find .Net lifecycle beans in configuration. + * + * @param cfg Configuration. + * @return Beans. + */ + private static List beans(IgniteConfiguration cfg) { + List res = new ArrayList<>(); + + if (cfg.getLifecycleBeans() != null) { + for (LifecycleBean bean : cfg.getLifecycleBeans()) { + if (bean instanceof PlatformDotNetLifecycleBean) + res.add((PlatformDotNetLifecycleBean)bean); + } + } + + return res; + } + + /** + * Create portable marshaller. + * + * @return Marshaller. + */ + @SuppressWarnings("deprecation") + private static GridPortableMarshaller marshaller() { + try { + PortableContext ctx = new PortableContext(new PortableMetaDataHandler() { + @Override public void addMeta(int typeId, PortableMetadata meta) + throws PortableException { + // No-op. + } + + @Override public PortableMetadata metadata(int typeId) throws PortableException { + return null; + } + }, null); + + PortableMarshaller marsh = new PortableMarshaller(); + + marsh.setContext(new MarshallerContextImpl(null)); + + ctx.configure(marsh); + + return new GridPortableMarshaller(ctx); + } + catch (IgniteCheckedException e) { + throw U.convertException(e); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationEx.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationEx.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationEx.java new file mode 100644 index 0000000..eaf0997 --- /dev/null +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetConfigurationEx.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.ignite.internal.processors.platform.dotnet; + +import org.apache.ignite.internal.processors.platform.PlatformConfigurationEx; +import org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway; +import org.apache.ignite.internal.processors.platform.memory.PlatformMemoryManagerImpl; +import org.apache.ignite.internal.processors.platform.utils.PlatformUtils; +import org.apache.ignite.platform.dotnet.PlatformDotNetConfiguration; + +import java.util.Collection; + +/** + * Extended .Net configuration. + */ +public class PlatformDotNetConfigurationEx extends PlatformDotNetConfiguration implements PlatformConfigurationEx { + /** Native gateway. */ + private final PlatformCallbackGateway gate; + + /** Memory manager. */ + private final PlatformMemoryManagerImpl memMgr; + + /** Warnings */ + private Collection warnings; + + /** + * Copy constructor. + * + * @param cfg Configuration to copy. + * @param gate Native gateway. + * @param memMgr Memory manager. + */ + public PlatformDotNetConfigurationEx(PlatformDotNetConfiguration cfg, PlatformCallbackGateway gate, + PlatformMemoryManagerImpl memMgr) { + super(cfg); + + this.gate = gate; + this.memMgr = memMgr; + } + + /** {@inheritDoc} */ + @Override public PlatformCallbackGateway gate() { + return gate; + } + + /** {@inheritDoc} */ + @Override public PlatformMemoryManagerImpl memory() { + return memMgr; + } + + /** {@inheritDoc} */ + @Override public String platform() { + return PlatformUtils.PLATFORM_DOTNET; + } + + /** {@inheritDoc} */ + @Override public Collection warnings() { + return warnings; + } + + /** + * @param warnings Warnings. + */ + public void warnings(Collection warnings) { + this.warnings = warnings; + } + + /** + * Unwrap extended configuration. + * + * @return Original configuration. + */ + public PlatformDotNetConfiguration unwrap() { + return new PlatformDotNetConfiguration(this); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/61aad3c3/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java ---------------------------------------------------------------------- diff --git a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java index 2e1da0b..ee3124d 100644 --- a/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java +++ b/modules/platform/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java @@ -48,11 +48,25 @@ import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.lang.IgniteUuid; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_PREFIX; + /** * Platform utility methods. */ @SuppressWarnings({"UnusedDeclaration", "unchecked"}) public class PlatformUtils { + /** Node attribute: platform. */ + public static final String ATTR_PLATFORM = ATTR_PREFIX + ".platform"; + + /** Platform: CPP. */ + public static final String PLATFORM_CPP = "cpp"; + + /** Platform: .Net. */ + public static final String PLATFORM_DOTNET = "dotnet"; + + /** Operation: prepare .Net platform. */ + public static final int OP_PREPARE_DOT_NET = 1; + /** Amount of peek modes available. */ private static final int CACHE_PEEK_MODES_CNT = CachePeekMode.values().length;