Commit 97aeacca authored by Bonita CI's avatar Bonita CI
Browse files

Merge branch 'CoreProduct' into 'master'

parents eee8e1df df7d1872
......@@ -98,8 +98,8 @@ dropBusinessDataDBOnExit=Clean business data database on exit
dropBusinessDataDBOnBDMChanges=Clean business data database on changes
queryExpressionGuidance=Select the Business Object and the corresponding query to execute. Set the value for each parameter required by the query.
bdmCompatibilityTitle=Warning: Impact of changes
bdmCompatibilityMsg=This BDM is available to all processes in your Studio, and to pages using REST API calls. Changing the BDM might cause inconsistencies.\nAfter the BDM update, validate each diagram and check your pages.\nIf you have changed the Mandatory or Multiple setting for an attribute, a unique constraint, or if you have changed a Business Object attribute Type you must clear the values of the business data in the database.
clearExistingBusinessData=Clear data
bdmCompatibilityMsg=This BDM is available to all processes in your Studio, and to application pages and process forms using REST API calls. Changing the BDM might cause inconsistencies.\nAfter the BDM update, validate each diagram and check your pages and forms.\n\nIf you have changed the Mandatory or Multiple setting for an attribute, a unique constraint, or if you have changed a non-primitive attribute type, you must reset the BDM database structure and data.
clearExistingBusinessData=Reset BDM database
businessObjectNameAlreadyExists=A Business Object already exists with the same name
installFailedTitle=Deploy failed
installFailedMessage=An error occurred while deploying the Business Data Model in engine
......
......@@ -132,7 +132,12 @@ public class RepositoryManager {
public Repository getRepository(final String repositoryName, final boolean migrationEnabled) {
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
final IProject project = workspace.getRoot().getProject(repositoryName);
if (project == null || !project.exists()) {
try {
if (project == null || !project.exists() || !project.hasNature(BonitaProjectNature.NATURE_ID)) {
return null;
}
} catch (final CoreException e) {
BonitaStudioLog.error(e);
return null;
}
return createRepository(repositoryName, migrationEnabled);
......
......@@ -125,7 +125,7 @@ alwaysUseScriptingModeOutputPref=Always use the scripting mode output (hide outp
unsuportedExpressionTypeForTesting=Unsupported expression type for testing:
unresolvedPatternOrScriptExpression=Input parameter {0} use an expression containing unreachable reference
unresolvedExpression=Input parameter {0} uses an unreachable Expression
deleteConnectorDefinition=Do you want to delete the connector definition {0} and the associated implementation(s) and saved configuration(s)?
deleteConnectorDefinition=Do you want to delete the connector definition {0} and the associated implementation(s) and saved configuration(s)?\nThe connector implementation will be removed but the Java source files will not be deleted because they might be used by other connectors.
configurationChangedTitle=Configuration inconsistency
configurationChangedMsg=Changes to this configuration have been made to match the new definition of this connector.\nPlease check that everything is consistent.
connectorOutput=Output parameter
......
......@@ -23,7 +23,8 @@ processInstantiationInputs=Process instantiation inputs
inputTabLabel=Inputs
constraintsTabLabel=Constraints
contractInputTypeLabel=Contract Input
removeInputConfirmationMessage=Are you sure you want to remove the following input?\nIf this input is COMPLEX it will remove all children.\nIf this input is a single reference of a constraint, this constraint will be removed.
removeInputConfirmationMessagePart1=Are you sure you want to remove the following input?
removeInputConfirmationMessagesPart2=\nIf this input is COMPLEX it will remove all children.\nIf this input is a single reference of a constraint, this constraint will be removed.
removeInputConfirmationTitle=Are you sure you want to remove contract input?
removeConstraintConfirmationTitle=Are you sure you want to remove contract constraint(s)?
removeConstraintConfirmationMessage=Are you sure you want to remove following constraint(s)?
......@@ -84,4 +85,4 @@ deselectAll=Deselect all
preview=Preview >
selectMandatories=Mandatory attributes
mandatoryFieldsNotSelectedWarning=Mandatory attribute(s) {0} is/are not selected. Either select it/them or initialize it/them manually.
mandatoryFieldsNotSelectedStepWarning=Mandatory attribute(s) {0} is/are not selected. Either select it/them or create storage and update operations.
mandatoryFieldsNotSelectedStepWarning=Mandatory attribute(s) {0} is/are not selected. Either select it/them or create storage and update operations.
\ No newline at end of file
......@@ -48,7 +48,8 @@ public class Messages extends NLS {
public static String constraintsTabLabel;
public static String contractInputTypeLabel;
public static String addChild;
public static String removeInputConfirmationMessage;
public static String removeInputConfirmationMessagePart1;
public static String removeInputConfirmationMessagesPart2;
public static String removeInputConfirmationTitle;
public static String returnType;
public static String up;
......
......@@ -225,10 +225,12 @@ public class ContractInputController implements IViewerController {
}
protected boolean openConfirmation(final List<?> selectedInput) {
final StringBuilder message = new StringBuilder(Messages.removeInputConfirmationMessage);
final StringBuilder message = new StringBuilder(Messages.removeInputConfirmationMessagePart1);
for (final Object input : selectedInput) {
message.append(SWT.CR);
message.append("- " + ((ContractInput) input).getName());
message.append(SWT.CR);
message.append(Messages.removeInputConfirmationMessagesPart2);
}
return FileActionDialog.getDisablePopup() ? true : MessageDialog.openConfirm(Display.getDefault().getActiveShell(),
Messages.removeInputConfirmationTitle, message.toString());
......
......@@ -16,6 +16,7 @@ package org.bonitasoft.studio.expression.editor.viewer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
......@@ -133,4 +134,22 @@ public class ExpressionViewerTest {
assertThat(mockedExprViewer.isOldContextAndInputSimilar(input2)).isFalse();
}
@Test
public void getContentTypeFromInputNullSupport() throws Exception {
doCallRealMethod().when(mockedExprViewer).getContentTypeFromInput(anyString());
final Expression selectedExpression = ExpressionBuilder.aConstantExpression().build();
doReturn(selectedExpression).when(mockedExprViewer).getSelectedExpression();
assertThat(mockedExprViewer.getContentTypeFromInput("test")).isEqualTo(ExpressionConstants.CONSTANT_TYPE);
}
@Test
public void getContentTypeFromInputMessageContent() throws Exception {
doCallRealMethod().when(mockedExprViewer).getContentTypeFromInput(anyString());
final Expression selectedExpression = ExpressionBuilder.anExpression().withExpressionType(ExpressionConstants.MESSAGE_ID_TYPE).build();
doReturn(selectedExpression).when(mockedExprViewer).getSelectedExpression();
assertThat(mockedExprViewer.getContentTypeFromInput("test")).isEqualTo(ExpressionConstants.MESSAGE_ID_TYPE);
}
}
......@@ -938,6 +938,8 @@ public class ExpressionViewer extends ContentViewer implements ExpressionConstan
return ExpressionConstants.SEARCH_INDEX_TYPE;
} else if (ExpressionConstants.QUERY_TYPE.equals(expressionType)) {
return ExpressionConstants.QUERY_TYPE;
} else if (ExpressionConstants.MESSAGE_ID_TYPE.equals(expressionType)) {
return ExpressionConstants.MESSAGE_ID_TYPE;
}
final Set<String> cache = new HashSet<String>();
......
......@@ -50,6 +50,8 @@ import org.bonitasoft.studio.model.expression.Expression;
import org.bonitasoft.studio.model.expression.ExpressionPackage;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.Converter;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
......@@ -337,7 +339,6 @@ public class GroovyScriptExpressionEditor extends SelectionAwareExpressionEditor
public void widgetSelected(final SelectionEvent e) {
if (automaticResolutionButton.getSelection()) {
removeDependencyButton.setEnabled(false);
dependencyJob.schedule();
}
depndencySection.setExpanded(!automaticResolutionButton.getSelection());
}
......@@ -490,6 +491,17 @@ public class GroovyScriptExpressionEditor extends SelectionAwareExpressionEditor
dataBindingContext.bindValue(SWTObservables.observeSelection(automaticResolutionButton), autoDepsModelObservable);
dataBindingContext.bindValue(SWTObservables.observeSelection(automaticResolutionButton), SWTObservables
.observeEnabled(addDependencyButton), opposite, new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER));
autoDepsModelObservable.addChangeListener(new IChangeListener() {
@Override
public void handleChange(final ChangeEvent event) {
if ((Boolean) autoDepsModelObservable.getValue()) {
if (dependencyJob != null) {
dependencyJob.schedule();
}
}
}
});
depndencySection.setExpanded(!automaticResolutionButton.getSelection());
addDependencyButton.setEnabled(!inputExpression.isAutomaticDependencies());
......
/**
* Copyright (C) 2015 Bonitasoft S.A.
* Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.studio.importer.bar.custom.migration;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import org.bonitasoft.studio.common.ExpressionConstants;
import org.bonitasoft.studio.model.process.ProcessPackage;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.edapt.spi.migration.Instance;
import org.eclipse.emf.edapt.spi.migration.Metamodel;
import org.eclipse.emf.edapt.spi.migration.Model;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class DataDefaultValueMigrationTest {
@Mock
private Metamodel metamodel;
@Mock
private Model model;
@Mock
private Instance expression;
private DataDefaultValueMigration migrationUnderTest;
@Before
public void setUp() throws Exception {
doReturn(new BasicEList<Instance>()).when(model).getAllInstances("form.Widget");
doReturn(new BasicEList<Instance>()).when(model).getAllInstances("process.Document");
doReturn(expression).when(model).newInstance("expression.Expression");
doReturn(ExpressionConstants.SCRIPT_TYPE).when(expression).get("type");
doReturn(new BasicEList<Instance>()).when(expression).get("referencedElements");
migrationUnderTest = spy(new DataDefaultValueMigration());
}
@Test
public void testDataDefaultValueWithStringIncludingItSelfDataName() throws Exception {
final BasicEList<Instance> processDatas = new BasicEList<Instance>();
final Instance processData1 = mock(Instance.class);
doReturn("myVar").when(processData1).get("name");
doReturn(false).when(processData1).get("multiple");
final Instance datatType = mock(Instance.class);
doReturn(datatType).when(processData1).get("dataType");
doReturn("${\"script including myVar in a String\"}").when(processData1).get("defaultValue");
doReturn("\"script including myVar in a String\"").when(expression).get("content");
doReturn(ProcessPackage.Literals.DATA_AWARE__DATA).when(processData1).getContainerReference();
doReturn(false).when(processData1).get("transient");
processDatas.add(processData1);
doReturn(processDatas).when(model).getAllInstances("process.Data");
final Instance processInstance = mock(Instance.class);
doReturn(true).when(processInstance).instanceOf("process.AbstractProcess");
doReturn(processDatas).when(processInstance).get("process.Data");
doReturn(processInstance).when(processData1).getContainer();
migrationUnderTest.migrateBefore(model, metamodel);
migrationUnderTest.migrateAfter(model, metamodel);
verify(expression).set("content", "\"script including myVar in a String\"");
verify(expression, never()).add(eq("referencedElements"), any(Instance.class));
}
}
......@@ -64,10 +64,12 @@ public class DataDefaultValueMigration extends ReportCustomMigration {
final String defaultValue = dataDefaultValue.get(uuid);
final StringToExpressionConverter converter = getConverter(model, getScope(data));
final String returnType = StringToExpressionConverter.getDataReturnType(data);
final String dataName = data.get("name");
converter.setDataToIgnore(dataName);
expression = converter.parse(defaultValue, returnType, false);
final String expressionType = expression.get("type");
if(ExpressionConstants.SCRIPT_TYPE.equals(expressionType)){
expression.set("name",data.get("name")+"DefaultValueScript");
expression.set("name",dataName+"DefaultValueScript");
final List<Instance> dependencies = expression.get("referencedElements");
boolean invalidDependency = false ;
for(final Instance dependency : dependencies){
......
......@@ -49,6 +49,8 @@ public class StringToExpressionConverter {
private boolean useSimulationDataScope = false;
private String dataNameToIgnore;
public StringToExpressionConverter(final Model model,
final Instance container) {
Assert.isNotNull(model);
......@@ -388,21 +390,15 @@ public class StringToExpressionConverter {
}
if (currentDataName != null) {
for (final String dataName : data.keySet()) {
if (currentDataName.contains(dataName)) {
if (currentDataName.contains(dataName) && !dataName.equals(dataNameToIgnore)) {
final int index = currentDataName.indexOf(dataName);
final boolean validPrefix = isValidPrefix(currentDataName,
index);
final boolean validSuffix = isValidSuffix(currentDataName,
dataName, index);
final boolean validPrefix = isValidPrefix(currentDataName, index);
final boolean validSuffix = isValidSuffix(currentDataName, dataName, index);
if (validPrefix && validSuffix) {
final Instance dependencyInstance = createVariableDependencyInstance(data
.get(dataName));
final List<Instance> instList = expression
.get("referencedElements");
if (!dependancyAlreadyExists(instList,
dependencyInstance)) {
expression.add("referencedElements",
dependencyInstance);
final Instance dependencyInstance = createVariableDependencyInstance(data.get(dataName));
final List<Instance> instList = expression.get("referencedElements");
if (!dependancyAlreadyExists(instList, dependencyInstance)) {
expression.add("referencedElements", dependencyInstance);
hasAdded = true;
}
}
......@@ -415,7 +411,7 @@ public class StringToExpressionConverter {
private boolean isValidSuffix(final String currentDataName,
final String dataName, final int index) {
boolean validSuffix = false;
if (index + dataName.length() < currentDataName.length() - 1) {
if (index + dataName.length() < currentDataName.length()) {
final String suffix = currentDataName.substring(
index + dataName.length(), index + dataName.length() + 1);
if (!Character.isLetter(suffix.toCharArray()[0])) {
......@@ -598,4 +594,8 @@ public class StringToExpressionConverter {
}
}
public void setDataToIgnore(final String dataName) {
dataNameToIgnore = dataName;
}
}
......@@ -275,7 +275,7 @@
<properties>
<os-jvm-flags>-XstartOnFirstThread</os-jvm-flags>
</properties>
</profile>
</profile>
<profile>
<id>tag-trunk</id>
<build>
......
/**
* Copyright (C) 2015 Bonitasoft S.A.
* Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.studio.importer.bar.tests.dataDependencies;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.bonitasoft.studio.common.jface.FileActionDialog;
import org.bonitasoft.studio.importer.bar.tests.BarImporterTestUtil;
import org.bonitasoft.studio.model.process.Activity;
import org.bonitasoft.studio.model.process.Data;
import org.bonitasoft.studio.model.process.MainProcess;
import org.bonitasoft.studio.model.process.Pool;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.emf.ecore.resource.Resource;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class DataDependenciesMigrationIT {
private static boolean disablepopup;
@BeforeClass
public static void disablePopup() {
disablepopup = FileActionDialog.getDisablePopup();
FileActionDialog.setDisablePopup(true);
}
@AfterClass
public static void resetdisablePopup() {
FileActionDialog.setDisablePopup(disablepopup);
}
@Test
public void testDefaultValueContainingVarNameInAString() throws Exception {
final MainProcess mainProcess = importBar("DefaultValueContainingVarNameInAString--1.0.bar");
final Pool pool = (Pool) mainProcess.getElements().get(0);
final Data data = pool.getData().get(0);
assertThat(data.getDefaultValue().getReferencedElements()).isEmpty();
}
@Test
@Ignore("usecase not covered")
public void testDefaultValueContainingAnotherVarNameInAString() throws Exception {
final MainProcess mainProcess = importBar("DefaultValueContainingAnotherVarNameInAString--1.0.bar");
final Pool pool = (Pool) mainProcess.getElements().get(0);
final Data data = pool.getData().get(0);
assertThat(data.getDefaultValue().getReferencedElements()).isEmpty();
final Data data2 = pool.getData().get(1);
assertThat(data2.getDefaultValue().getReferencedElements()).isEmpty();
}
@Test
public void testStepDataInitializedWithProcessData() throws Exception {
final MainProcess mainProcess = importBar("StepDataInitializedWithProcessData--1.0.bar");
final Pool pool = (Pool) mainProcess.getElements().get(0);
final Data data = pool.getData().get(0);
assertThat(data.getDefaultValue().getReferencedElements()).isEmpty();
final Data stepData = ((Activity) pool.getElements().get(0)).getData().get(0);
assertThat(stepData.getDefaultValue().getReferencedElements()).isNotEmpty();
}
protected MainProcess importBar(final String barName) throws IOException, Exception {
final URL fileURL2 = FileLocator.toFileURL(DataDependenciesMigrationIT.class.getResource(barName)); //$NON-NLS-1$
final File migratedProcess = BarImporterTestUtil.migrateBar(fileURL2);
assertNotNull("Fail to migrate bar file", migratedProcess);
assertNotNull("Fail to migrate bar file", migratedProcess.exists());
final Resource resource = BarImporterTestUtil.assertIsLoadable(migratedProcess);
final MainProcess mainProcess = BarImporterTestUtil.getMainProcess(resource);
return mainProcess;
}
}
......@@ -5,12 +5,10 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
......@@ -29,14 +27,11 @@ import org.eclipse.swtbot.swt.finder.waits.ICondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem;
/**
* @author Romain Bioteau
*
*/
public class BotContractConstraintRow extends BotBase {
private TableItem tableItem;
private final SWTBotTableItem swtBotTableItem;
......@@ -54,12 +49,13 @@ public class BotContractConstraintRow extends BotBase {
swtBotTableItem = getTableItem(bot.tableWithId(SWTBotConstants.SWTBOT_ID_CONTRACT_CONSTRAINT_TABLE), row);
}
public BotContractConstraintRow setName(final String name){
public BotContractConstraintRow setName(final String name) {
constraintTable.setFocus();
constraintTable.click(row, NAME_COLUMN);
bot.textWithId(SWTBotConstants.SWTBOT_ID_CONSTRAINT_NAME_TEXTEDITOR);
typeText(name);
pressEnter();
bot.waitUntil(textApplied(name, NAME_COLUMN));
return this;
}
......@@ -76,7 +72,6 @@ public class BotContractConstraintRow extends BotBase {
private SWTBotTableItem getTableItem(final SWTBotTable swtBotTable, final int row) {
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
final Table table = swtBotTable.widget;
......@@ -93,11 +88,21 @@ public class BotContractConstraintRow extends BotBase {
bot.textWithId(SWTBotConstants.SWTBOT_ID_CONSTRAINT_ERROR_MESSAGE_TEXTEDITOR);
typeText(errorMessage);
pressEnter();
bot.waitUntil(new ICondition() {
bot.waitUntil(textApplied(errorMessage, ERROR_MESSAGE_COLUMN));
return this;
}
public BotContractConstraintRow select() {
swtBotTableItem.select();
return this;
}
private ICondition textApplied(final String text, final int column) {
return new ICondition() {
@Override
public boolean test() throws Exception {
return errorMessage.equals(constraintTable.getTableItem(row).getText(ERROR_MESSAGE_COLUMN));
return text.equals(constraintTable.getTableItem(row).getText(column));
}
@Override
......@@ -106,18 +111,8 @@ public class BotContractConstraintRow extends BotBase {
@Override
public String getFailureMessage() {
return "item not found: " + errorMessage + " in " + constraintTable.getTableItem(row).getText(ERROR_MESSAGE_COLUMN);
return "item not found: " + text + " in " + constraintTable.getTableItem(row).getText(column);
}
});
return this;
};
}
public BotContractConstraintRow select() {
swtBotTableItem.select();
return this;
}
}
......@@ -15,8 +15,8 @@ hideValidStatusAction=\u6709\u52b9\u306a\u5909\u66f4\u3092\u975e\u8868\u793a
hideReviewedAction=\u30ec\u30d3\u30e5\u30fc\u6e08\u307f\u5909\u66f4\u3092\u975e\u8868\u793a
description=\u8aac\u660e
okStatusTooltip=\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093\u3002
warningStatusTooltip=\u30ec\u30d3\u30e5\u30fc\u304c\u5fc5\u8981\u3067\u3059\: \u8aac\u660e\u30d1\u30cd\u30eb\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
errorStatusTooltip=\u30a2\u30af\u30b7\u30e7\u30f3\u304c\u5fc5\u8981\u3067\u3059\: \u8aac\u660e\u30d1\u30cd\u30eb\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
warningStatusTooltip=\u30ec\u30d3\u30e5\u30fc\u304c\u5fc5\u8981\u3067\u3059\: \u5b9a\u7fa9\u30d1\u30cd\u30eb\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
errorStatusTooltip=\u30a2\u30af\u30b7\u30e7\u30f3\u304c\u5fc5\u8981\u3067\u3059\: \u5b9a\u7fa9\u30d1\u30cd\u30eb\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
yes=\u306f\u3044
no=\u3044\u3044\u3048
noActionRequired=\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093\u3002
......