// ============================================================================
//
// Copyright (C) 2006-2016 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 com.amalto.workbench.detailtabs.sections.handlers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.xsd.XSDConstrainingFacet;
import org.eclipse.xsd.XSDFacet;
import com.amalto.workbench.detailtabs.exception.CommitException;
import com.amalto.workbench.detailtabs.exception.CommitValidationException;
import com.amalto.workbench.detailtabs.sections.model.simpletype.SimpleTypeWrapper;
import com.amalto.workbench.i18n.Messages;
public abstract class SimpleTypeFacetCommitHandlerHelper {
protected SimpleTypeFacetCommitHandler commitHandler;
public SimpleTypeFacetCommitHandlerHelper(SimpleTypeFacetCommitHandler commitHandler) {
this.commitHandler = commitHandler;
}
public static SimpleTypeFacetCommitHandlerHelper createHelperForStringFacet(SimpleTypeFacetCommitHandler commitHandler) {
return new SimpleTypeFacetCommitHandlerHelper_StringFacet(commitHandler);
}
public static SimpleTypeFacetCommitHandlerHelper createHelperForDoubleFacet(SimpleTypeFacetCommitHandler commitHandler) {
return new SimpleTypeFacetCommitHandlerHelper_DoubleFacet(commitHandler);
}
public static SimpleTypeFacetCommitHandlerHelper createHelperForIntFacet(SimpleTypeFacetCommitHandler commitHandler) {
return new SimpleTypeFacetCommitHandlerHelper_IntFacet(commitHandler);
}
public static SimpleTypeFacetCommitHandlerHelper createHelperForStringArrayFacet(SimpleTypeFacetCommitHandler commitHandler) {
return new SimpleTypeFacetCommitHandlerHelper_StringArrayFacet(commitHandler);
}
protected abstract void validateCommit(String facetName) throws CommitValidationException;
protected abstract boolean doCommit(String facetName) throws CommitException;
}
class SimpleTypeFacetCommitHandlerHelper_StringFacet extends SimpleTypeFacetCommitHandlerHelper {
public SimpleTypeFacetCommitHandlerHelper_StringFacet(SimpleTypeFacetCommitHandler commitHandler) {
super(commitHandler);
}
@Override
protected void validateCommit(String facetName) throws CommitValidationException {
if (!(commitHandler.getCommitedObj().getFacetValue(facetName) instanceof String))
throw new CommitValidationException(Messages.SimpleTypeFacetCommitHandlerHelper_ValueTypeOfFacet + facetName + Messages.SimpleTypeFacetCommitHandlerHelper_ShouldbeString);
}
@Override
protected boolean doCommit(String facetName) throws CommitException {
String newValue = (String) commitHandler.getCommitedObj().getFacetValue(facetName);
String oldValue = getOldFacetValue();
if (oldValue.equals(newValue))
return false;
if (!"".equals(oldValue))//$NON-NLS-1$
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents()
.removeAll(Arrays.asList(commitHandler.getOldFacets()));
if (!"".equals(newValue)) {//$NON-NLS-1$
XSDConstrainingFacet f = commitHandler.creatNewFacet();
f.setLexicalValue("" + newValue);//$NON-NLS-1$
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents().add(f);
}
return true;
}
protected String getOldFacetValue() {
if (commitHandler.getOldFacets().length == 0)
return "";//$NON-NLS-1$
XSDFacet facet = commitHandler.getOldFacets()[0];
if (facet == null || facet.getLexicalValue() == null)
return "";//$NON-NLS-1$
return facet.getLexicalValue();
}
}
class SimpleTypeFacetCommitHandlerHelper_DoubleFacet extends SimpleTypeFacetCommitHandlerHelper {
public SimpleTypeFacetCommitHandlerHelper_DoubleFacet(SimpleTypeFacetCommitHandler commitHandler) {
super(commitHandler);
}
@Override
protected void validateCommit(String facetName) throws CommitValidationException {
if (commitHandler.getCommitedObj().getFacetValue(facetName) != null) {
if (!(commitHandler.getCommitedObj().getFacetValue(facetName) instanceof Double)
|| ((Double) commitHandler.getCommitedObj().getFacetValue(facetName)) < 0)
throw new CommitValidationException(Messages.SimpleTypeFacetCommitHandlerHelper_ValueTypeOfFacet + facetName
+ Messages.SimpleTypeFacetCommitHandlerHelper_ShouldbeDoubleOr0);
}
}
@Override
protected boolean doCommit(String facetName) throws CommitException {
Double newValue = (Double) commitHandler.getCommitedObj().getFacetValue(facetName);
Double oldValue = getOldFacetValue();
if ((newValue == null && oldValue == null) || (oldValue != null && oldValue.equals(newValue))
|| (newValue != null && newValue.equals(oldValue)))
return false;
if (oldValue != null)
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents()
.removeAll(Arrays.asList(commitHandler.getOldFacets()));
if (newValue != null && newValue >= 0) {
XSDConstrainingFacet f = commitHandler.creatNewFacet();
f.setLexicalValue("" + newValue);//$NON-NLS-1$
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents().add(f);
}
return true;
}
protected Double getOldFacetValue() {
if (commitHandler.getOldFacets().length == 0)
return null;
XSDFacet facet = commitHandler.getOldFacets()[0];
if (facet == null || facet.getLexicalValue() == null)
return null;
return Double.parseDouble(facet.getLexicalValue());
}
}
class SimpleTypeFacetCommitHandlerHelper_IntFacet extends SimpleTypeFacetCommitHandlerHelper {
public SimpleTypeFacetCommitHandlerHelper_IntFacet(SimpleTypeFacetCommitHandler commitHandler) {
super(commitHandler);
}
@Override
protected void validateCommit(String facetName) throws CommitValidationException {
if (commitHandler.getCommitedObj().getFacetValue(facetName) != null) {
if (!(commitHandler.getCommitedObj().getFacetValue(facetName) instanceof Integer)
|| ((Integer) commitHandler.getCommitedObj().getFacetValue(facetName)) < 0)
throw new CommitValidationException(Messages.SimpleTypeFacetCommitHandlerHelper_ValueTypeOfFacet + facetName
+ Messages.SimpleTypeFacetCommitHandlerHelper_ShouldbePosition);
}
}
@Override
protected boolean doCommit(String facetName) throws CommitException {
Integer newValue = (Integer) commitHandler.getCommitedObj().getFacetValue(facetName);
Integer oldValue = getOldFacetValue();
if ((newValue == null && oldValue == null) || (oldValue != null && oldValue.equals(newValue))
|| (newValue != null && newValue.equals(oldValue)))
return false;
if (oldValue != null)
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents()
.removeAll(Arrays.asList(commitHandler.getOldFacets()));
if (newValue != null && newValue >= 0) {
XSDConstrainingFacet f = commitHandler.creatNewFacet();
f.setLexicalValue("" + newValue);//$NON-NLS-1$
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents().add(f);
}
return true;
}
protected Integer getOldFacetValue() {
if (commitHandler.getOldFacets().length == 0)
return 0;
XSDFacet facet = commitHandler.getOldFacets()[0];
if (facet == null || facet.getLexicalValue() == null)
return null;
return Integer.parseInt(facet.getLexicalValue());
}
}
class SimpleTypeFacetCommitHandlerHelper_StringArrayFacet extends SimpleTypeFacetCommitHandlerHelper {
public SimpleTypeFacetCommitHandlerHelper_StringArrayFacet(SimpleTypeFacetCommitHandler commitHandler) {
super(commitHandler);
}
@Override
protected void validateCommit(String facetName) throws CommitValidationException {
if (!(commitHandler.getCommitedObj().getFacetValue(facetName) instanceof String[]))
throw new CommitValidationException(Messages.SimpleTypeFacetCommitHandlerHelper_ValueTypeOfFacet + facetName + Messages.SimpleTypeFacetCommitHandlerHelper_ShouldbeStringArray);
}
@Override
protected boolean doCommit(String facetName) throws CommitException {
if (!hasChange(commitHandler.getCommitedObj(), facetName))
return false;
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents()
.removeAll(Arrays.asList(commitHandler.getOldFacets()));
for (String eachNewFacetValue : (String[]) commitHandler.getCommitedObj().getFacetValue(facetName)) {
XSDConstrainingFacet f = commitHandler.creatNewFacet();
f.setLexicalValue(eachNewFacetValue);
commitHandler.getCommitedObj().getXSDSimpleType().getFacetContents().add(f);
}
return true;
}
private boolean hasChange(SimpleTypeWrapper simpleTypeWrapper, String facetName) {
List<String> oldFacetValues = getOldFacetValues();
List<String> newFacetValues = Arrays.asList((String[]) simpleTypeWrapper.getFacetValue(facetName));
if (oldFacetValues.size() != newFacetValues.size())
return true;
for (String eachNewValue : newFacetValues) {
if (!oldFacetValues.contains(eachNewValue))
return true;
}
for (String eachOldFacetValue : oldFacetValues) {
if (!newFacetValues.contains(eachOldFacetValue))
return true;
}
return false;
}
private List<String> getOldFacetValues() {
List<String> oldPatterns = new ArrayList<String>();
for (XSDFacet eachOldFacet : commitHandler.getOldFacets()) {
if (eachOldFacet.getLexicalValue() == null || "".equals(eachOldFacet.getLexicalValue().trim()))//$NON-NLS-1$
continue;
oldPatterns.add(eachOldFacet.getLexicalValue());
}
return oldPatterns;
}
}