blob: 4b7359a8afac76144dcf2586f469e490d405223f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.j2ee.core.support.java.method;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.netbeans.modules.j2ee.core.api.support.java.method.MethodModel;
import org.openide.NotificationLineSupport;
import org.openide.NotifyDescriptor;
import org.openide.util.NbBundle;
import org.openide.util.Utilities;
/**
*
* @author Martin Adamek
*/
public final class ValidatingPropertyChangeListener implements PropertyChangeListener {
private final MethodCustomizerPanel panel;
private final NotifyDescriptor notifyDescriptor;
private final NotificationLineSupport statusLine;
private final boolean checkInterfaces;
private final Collection<MethodModel> existingMethods;
private final Set<String> existingMethodsNames; // just for faster validation, if such name exists, more detailed validation follows
private final String prefix;
public ValidatingPropertyChangeListener(MethodCustomizerPanel panel, NotifyDescriptor notifyDescriptor, Collection<MethodModel> existingMethods, String prefix) {
this.panel = panel;
this.notifyDescriptor = notifyDescriptor;
statusLine = notifyDescriptor.createNotificationLineSupport();
this.checkInterfaces = panel.supportsInterfacesChecking();
this.existingMethods = existingMethods;
this.existingMethodsNames = new HashSet<String>();
for (MethodModel methodModel : existingMethods) {
existingMethodsNames.add(methodModel.getName());
}
this.prefix = prefix;
}
public void propertyChange(PropertyChangeEvent event) {
validate();
}
// protected for testing
protected boolean validate() {
statusLine.clearMessages();
notifyDescriptor.setValid(false);
// method name
String name = panel.getMethodName();
if (!Utilities.isJavaIdentifier(name)) {
statusLine.setErrorMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "ERROR_nameNonJavaIdentifier")); // NOI18N
return false;
}
// valid method name prefix
if (prefix != null) {
if (!name.startsWith(prefix)) {
statusLine.setErrorMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "ERROR_wrongMethodPrefix", prefix)); // NOI18N
return false;
}
}
// return type
String returnType = panel.getReturnType();
if ("".equals(returnType)) { // NOI18N
statusLine.setErrorMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "ERROR_returnTypeInvalid")); // NOI18N
return false;
}
// interfaces
if (checkInterfaces) {
boolean local = panel.hasLocal();
boolean remote = panel.hasRemote();
boolean allowsNoInterface = panel.allowsNoInterface();
if (!allowsNoInterface && !local && !remote) {
statusLine.setErrorMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "ERROR_selectSomeInterface")); // NOI18N
return false;
}
if (local && remote) {
statusLine.setWarningMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "LBL_commonImplForBothInterfaces")); // NOI18N
}
}
// existing methods
if (existingMethodsNames.contains(name)) {
List<MethodModel.Variable> proposedParams = panel.getParameters();
for (MethodModel methodModel : existingMethods) {
if (sameParams(proposedParams, methodModel.getParameters())) {
statusLine.setErrorMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "ERROR_methodExists")); // NOI18N
return false;
}
}
}
// method parameters
List<MethodModel.Variable> params = panel.getParameters();
for (MethodModel.Variable param : params) {
String parName = param.getName();
int count = 0;
for (MethodModel.Variable par : params) {
if (parName.equals(par.getName())) {
count++;
}
}
if (count > 1) {
statusLine.setErrorMessage(NbBundle.getMessage(ValidatingPropertyChangeListener.class, "ERROR_duplicateParameterName", parName)); // NOI18N
return false;
}
}
notifyDescriptor.setValid(true);
return true;
}
private boolean sameParams(List<MethodModel.Variable> proposedParams, List<MethodModel.Variable> existingParams) {
if (existingParams.size() == proposedParams.size()) {
for (int i = 0; i < existingParams.size(); i++) {
String existingType = existingParams.get(i).getType();
String proposedType = proposedParams.get(i).getType();
int existingIndex = existingType.lastIndexOf('.');
int proposedIndex = proposedType.lastIndexOf('.');
// try to get right result even if comparing String and java.lang.String; compare only simple names
if (existingIndex == -1 && proposedIndex != -1) {
proposedType = proposedType.substring(proposedIndex + 1);
} else if (existingIndex != -1 && proposedIndex == -1) {
existingType = existingType.substring(existingIndex + 1);
}
if (!existingType.equals(proposedType)) {
return false;
}
}
} else {
return false;
}
return true;
}
}