/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.meta.action.impl;
import java.text.MessageFormat;
import java.util.*;
import org.jboss.tools.common.meta.XChild;
import org.jboss.tools.common.meta.action.*;
import org.jboss.tools.common.meta.action.impl.handlers.DefaultCreateHandler;
import org.jboss.tools.common.meta.impl.XMetaDataConstants;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.CreateFileHandler;
import org.jboss.tools.common.model.loaders.EntityRecognizerContext;
import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
public class DefaultWizardDataValidator implements WizardDataValidator {
protected SpecialWizardSupport support;
protected int step;
protected String message = null;
protected String warning = null;
public void setSupport(SpecialWizardSupport support, int step) {
this.support = support;
this.step = step;
}
public int getId() {
return step;
}
public void validate(Properties data) {
message = null;
warning = null;
XEntityData[] ds = support.getEntityData();
if(ds.length <= step) return;
if(support.action != null) {
if(XModelObjectConstants.TRUE.equals(support.action.getProperty("validator.add")) && step == 0) { //$NON-NLS-1$
String entity = support.action.getProperty(XMetaDataConstants.ENTITY);
if(entity == null) entity = ds[step].getModelEntity().getName();
if(!checkChild(support.getTarget(), entity, data)) return;
XModelObject parent = support.getTarget();
int childCount = parent.getChildren(entity).length;
XChild c = support.getTarget().getModelEntity().getChild(entity);
int max = c == null ? 0 : c.getMaxCount();
if(c != null && max <= childCount) {
String parentTitle = DefaultCreateHandler.title(parent, true);
// TODO (i18n) this assumes Germanic-type plurals
message = ((max == 1) ?
MessageFormat.format(
"{0} can contain only {1} child with entity {2}.",
parentTitle, max, entity)
: MessageFormat.format(
"{0} can contain only {1} children with entity {2}.",
parentTitle, max, entity));
}
} else if(XModelObjectConstants.TRUE.equals(support.action.getProperty("validator.edit"))) { //$NON-NLS-1$
String entity = support.action.getProperty(XMetaDataConstants.ENTITY);
if(entity == null) entity = ds[step].getModelEntity().getName();
if(!checkChild(support.getTarget().getParent(), entity, data)) return;
}
}
if(message != null) return;
XAttributeData[] as = ds[step].getAttributeData();
for (int i = 0; i < as.length; i++) {
String n = as[i].getAttribute().getName();
String value = data.getProperty(n);
if(value == null) value = ""; //$NON-NLS-1$
if(!support.isFieldEditorEnabled(step, n, data)) continue;
message = DefaultCreateHandler.validateAttribute(as[i], value);
if(message != null) return;
}
if(message != null || support.action == null) return;
if(XModelObjectConstants.TRUE.equals(support.action.getProperty("validator.addfile")) && step == 0) { //$NON-NLS-1$
validateAddFile(ds, data);
}
String resourceAttr = support.action.getProperty("validator.resource"); //$NON-NLS-1$
if(resourceAttr != null) {
String value = data.getProperty(resourceAttr);
if(value != null && (!new java.io.File(value).exists())) {
message = MessageFormat.format("Resource {0} does not exist.", value);
}
}
}
protected void validateAddFile(XEntityData[] ds, Properties data) {
CreateFileHandler.validateNameAndExtension(support.action, data, null);
String entity = support.action.getProperty(XMetaDataConstants.ENTITY);
if(entity == null) {
String ext = null;
entity = (ext != null) ? support.getTarget().getModel().getEntityRecognizer().getEntityName(new EntityRecognizerContext(ext))
: ds[step].getModelEntity().getName();
if(entity == null || support.getTarget().getModel().getMetaData().getEntity(entity) == null)
entity = ds[step].getModelEntity().getName();
}
XModelObject o = support.getTarget().getModel().createModelObject(entity, data);
if(o != null) message = DefaultCreateHandler.getContainsMessage(support.getTarget(), o);
}
public String getErrorMessage() {
return message;
}
public String getWarningMessage() {
return warning;
}
public boolean isCommandEnabled(String command) {
if(message != null) {
if(SpecialWizardSupport.OK.equals(command) || SpecialWizardSupport.NEXT.equals(command) || SpecialWizardSupport.FINISH.equals(command)) return false;
}
return support.isActionEnabled(command);
}
protected boolean checkChild(XModelObject parent, String entity, Properties data) {
XModelObject o = support.getTarget().getModel().createModelObject(entity, data);
if(o.getModelEntity().getAttribute(XModelObjectLoaderUtil.ATTR_ID_NAME) != null
&& !XModelObjectConstants.TRUE.equals(o.getModelEntity().getProperty("unique"))) return true; //$NON-NLS-1$
if(o != null && parent == support.getTarget().getParent() && o.getPathPart().equals(support.getTarget().getPathPart())) return true;
if(o != null) message = DefaultCreateHandler.getContainsMessage(parent, o);
return message == null;
}
}