diff --git a/appserver/persistence/jpa-container/pom.xml b/appserver/persistence/jpa-container/pom.xml index eef57081800..c95a2b6f87e 100644 --- a/appserver/persistence/jpa-container/pom.xml +++ b/appserver/persistence/jpa-container/pom.xml @@ -40,6 +40,7 @@ holder. --> + 4.0.0 @@ -124,5 +125,10 @@ internal-api ${project.version} + + fish.payara.server.internal.admin + admin-cli + ${project.version} + diff --git a/appserver/persistence/jpa-container/src/main/java/org/glassfish/persistence/jpa/JPADeployer.java b/appserver/persistence/jpa-container/src/main/java/org/glassfish/persistence/jpa/JPADeployer.java index 7cf63476ff8..af457a21b2d 100644 --- a/appserver/persistence/jpa-container/src/main/java/org/glassfish/persistence/jpa/JPADeployer.java +++ b/appserver/persistence/jpa-container/src/main/java/org/glassfish/persistence/jpa/JPADeployer.java @@ -37,11 +37,17 @@ * only if the new code is made subject to such option by the copyright * holder. */ -// Portions Copyright [2016-2017] [Payara Foundation and/or its affiliates] +// Portions Copyright [2016-2020] [Payara Foundation and/or its affiliates] package org.glassfish.persistence.jpa; import com.sun.appserv.connectors.internal.api.ConnectorRuntime; +import com.sun.appserv.connectors.internal.api.ConnectorRuntimeException; +import com.sun.enterprise.admin.cli.Environment; +import com.sun.enterprise.admin.cli.ProgramOptions; +import com.sun.enterprise.admin.cli.remote.RemoteCLICommand; +import com.sun.enterprise.admin.report.PlainTextActionReporter; +import com.sun.enterprise.admin.util.RemoteInstanceCommandHelper; import com.sun.enterprise.deployment.*; import com.sun.enterprise.deployment.util.DOLUtils; import com.sun.enterprise.module.bootstrap.StartupContext; @@ -73,6 +79,13 @@ import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +import org.glassfish.api.ActionReport; +import org.glassfish.api.admin.CommandException; +import org.glassfish.api.admin.CommandRunner; +import org.glassfish.api.admin.ParameterMap; +import org.glassfish.deployment.common.DeploymentProperties; +import org.glassfish.internal.api.Globals; +import org.glassfish.internal.api.InternalSystemAdministrator; /** @@ -204,6 +217,35 @@ private void createEMFs(DeploymentContext context) { @Override void visitPUD(PersistenceUnitDescriptor pud, DeploymentContext context) { if(referencedPus.contains(pud)) { boolean isDas = isDas(); + if (isDas && !isTargetDas(context.getCommandParameters(DeployCommandParameters.class))) { + + DeployCommandParameters deployParams = context.getCommandParameters(DeployCommandParameters.class); + + //If on DAS and not generating schema for remotes then return here + String jpaScemaGeneration = pud.getProperties().getProperty("javax.persistence.schema-generation.database.action", "none").toLowerCase(); + String eclipselinkSchemaGeneration = pud.getProperties().getProperty("eclipselink.ddl-generation", "none").toLowerCase(); + if ("none".equals(jpaScemaGeneration) && "none".equals(eclipselinkSchemaGeneration)) { + return; + } else { + InternalSystemAdministrator kernelIdentity = Globals.getDefaultHabitat().getService(InternalSystemAdministrator.class); + CommandRunner commandRunner = Globals.getDefaultHabitat().getService(CommandRunner.class); + CommandRunner.CommandInvocation getTranslatedValueCommand = commandRunner.getCommandInvocation("_get-translated-config-value", new PlainTextActionReporter(), kernelIdentity.getSubject()); + ParameterMap params = new ParameterMap(); + params.add("propertyName", pud.getJtaDataSource()); + params.add("target", deployParams.target); + getTranslatedValueCommand.parameters(params); + getTranslatedValueCommand.execute(); + ActionReport report = getTranslatedValueCommand.report(); + if (report.hasSuccesses() && report.getSubActionsReport().size() == 1) { + ActionReport subReport = report.getSubActionsReport().get(0); + String value = subReport.getMessage().replace(deployParams.target + ":", ""); + pud.setJtaDataSource(value.trim()); + } else { + logger.log(Level.SEVERE, report.getMessage(), report.getFailureCause()); + } + + } + } // While running in embedded mode, it is not possible to guarantee that entity classes are not loaded by the app classloader before transformers are installed // If that happens, weaving will not take place and EclipseLink will throw up. Provide users an option to disable weaving by passing the flag. @@ -231,6 +273,10 @@ private void createEMFs(DeploymentContext context) { if (dcp.isSkipDSFailure() && ExceptionUtil.isDSFailure(e)) { logger.log(Level.WARNING, "Resource communication failure exception skipped while loading the pu " + pud.getName(), e); } else { + if (e.getCause() instanceof ConnectorRuntimeException) { + logger.log(Level.SEVERE, "{0} is not a valid data source. If you are using variable replacement then" + + "ensure that is available on the DAS."); + } throw e; } } diff --git a/nucleus/cluster/admin/src/main/java/fish/payara/admin/cluster/GetTranslatedConfigValue.java b/nucleus/cluster/admin/src/main/java/fish/payara/admin/cluster/GetTranslatedConfigValue.java new file mode 100644 index 00000000000..a8be23f30e2 --- /dev/null +++ b/nucleus/cluster/admin/src/main/java/fish/payara/admin/cluster/GetTranslatedConfigValue.java @@ -0,0 +1,90 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2020 Payara Foundation and/or its affiliates. All rights reserved. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common Development + * and Distribution License("CDDL") (collectively, the "License"). You + * may not use this file except in compliance with the License. You can + * obtain a copy of the License at + * https://github.com/payara/Payara/blob/master/LICENSE.txt + * See the License for the specific + * language governing permissions and limitations under the License. + * + * When distributing the software, include this License Header Notice in each + * file and include the License file at glassfish/legal/LICENSE.txt. + * + * GPL Classpath Exception: + * The Payara Foundation designates this particular file as subject to the "Classpath" + * exception as provided by the Payara Foundation in the GPL Version 2 section of the License + * file that accompanied this code. + * + * Modifications: + * If applicable, add the following below the License Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyright [year] [name of copyright owner]" + * + * Contributor(s): + * If you wish your version of this file to be governed by only the CDDL or + * only the GPL Version 2, indicate your decision by adding "[Contributor] + * elects to include this software in this distribution under the [CDDL or GPL + * Version 2] license." If you don't indicate a single choice of license, a + * recipient has the option to distribute your version of this file under + * either the CDDL, the GPL Version 2 or to extend the choice of license to + * its licensees as provided above. However, if you add GPL Version 2 code + * and therefore, elected the GPL Version 2 license, then the option applies + * only if the new code is made subject to such option by the copyright + * holder. + */ +package fish.payara.admin.cluster; + +import com.sun.enterprise.config.serverbeans.Config; +import com.sun.enterprise.util.StringUtils; +import javax.inject.Inject; +import org.glassfish.api.ActionReport; +import org.glassfish.api.Param; +import org.glassfish.api.admin.AdminCommand; +import org.glassfish.api.admin.AdminCommandContext; +import org.glassfish.api.admin.RestEndpoint; +import org.glassfish.api.admin.RestEndpoints; +import org.glassfish.api.admin.ServerEnvironment; +import org.glassfish.config.support.TranslatedConfigView; +import org.glassfish.hk2.api.PerLookup; +import org.jvnet.hk2.annotations.Service; + +/** + * Returns the translated value of a property on a local instance + * @author jonathan coustick + * @see TranslatedConfigView + */ +@Service(name = "_get-translated-config-value") +@PerLookup +@RestEndpoints({ + @RestEndpoint(configBean = Config.class, + opType = RestEndpoint.OpType.GET, + path = "get-translated-config-value", + description = "Gets the Ordinal of a builtin Config Source") +}) +public class GetTranslatedConfigValue implements AdminCommand { + + @Param + String propertyName; + + @Param(optional=true, defaultValue = "server") + String target; + + @Inject + ServerEnvironment env; + + @Override + public void execute(AdminCommandContext context) { + if (StringUtils.ok(target) && !target.equals(env.getInstanceName())) { + return; + } + ActionReport report = context.getActionReport(); + report.setMessage(TranslatedConfigView.expandConfigValue(propertyName)); + report.setActionExitCode(ActionReport.ExitCode.SUCCESS); + } + +}