/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.uberfire.ext.plugin.client.validation;
import java.util.Collection;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator;
import org.uberfire.ext.editor.commons.client.validation.ValidationErrorReason;
import org.uberfire.ext.editor.commons.client.validation.Validator;
import org.uberfire.ext.editor.commons.client.validation.ValidatorCallback;
import org.uberfire.ext.editor.commons.client.validation.ValidatorWithReasonCallback;
import org.uberfire.ext.plugin.client.info.PluginsInfo;
import org.uberfire.ext.plugin.model.Activity;
import org.uberfire.ext.plugin.model.Plugin;
import org.uberfire.ext.plugin.service.PluginServices;
@ApplicationScoped
public class PluginNameValidator implements Validator {
@Inject
Caller<PluginServices> pluginServices;
@Inject
private PluginsInfo pluginsInfo;
@Inject
private DefaultFileNameValidator defaultFileNameValidator;
@Override
public void validate(final String name,
final ValidatorCallback callback) {
validateName(name,
new ValidatorWithReasonCallback() {
@Override
public void onFailure(final String reason) {
if (shouldGiveReasonOfValidationError(callback)) {
((ValidatorWithReasonCallback) callback).onFailure(reason);
} else {
callback.onFailure();
}
}
@Override
public void onSuccess() {
defaultFileNameValidator.validate(name,
callback);
}
@Override
public void onFailure() {
callback.onFailure();
}
});
}
private boolean shouldGiveReasonOfValidationError(final ValidatorCallback callback) {
return callback instanceof ValidatorWithReasonCallback;
}
protected void validateName(final String name,
final ValidatorWithReasonCallback callback) {
final String nameWithoutExtension = (name.lastIndexOf(".") >= 0
? name.substring(0,
name.lastIndexOf(".")) : name);
final RuleValidator nameValidator = getNameValidator();
if (!nameValidator.isValid(nameWithoutExtension)) {
callback.onFailure(nameValidator.getValidationError());
return;
}
pluginServices.call(new RemoteCallback<Collection<Plugin>>() {
@Override
public void callback(final Collection<Plugin> plugins) {
Set<Activity> activities = pluginsInfo.getAllPlugins(plugins);
for (Activity activity : activities) {
if (activity.getName().equalsIgnoreCase(nameWithoutExtension)) {
callback.onFailure(ValidationErrorReason.DUPLICATED_NAME.name());
return;
}
}
callback.onSuccess();
}
}).listPlugins();
}
private RuleValidator getNameValidator() {
return NameValidator.createNameValidator(ValidationErrorReason.EMPTY_NAME.name(),
ValidationErrorReason.INVALID_NAME.name());
}
}