blob: ec5b2d44ded5b9e5e7505fe50773efa827e49574 [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.web.refactoring.rename;
import java.util.List;
import org.netbeans.modules.refactoring.api.AbstractRefactoring;
import org.netbeans.modules.refactoring.api.Problem;
import org.netbeans.modules.refactoring.spi.RefactoringElementsBag;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.modules.web.refactoring.RefactoringUtil;
import org.netbeans.modules.web.refactoring.TldRefactoring;
import org.netbeans.modules.web.taglib.model.FunctionType;
import org.netbeans.modules.web.taglib.model.ListenerType;
import org.netbeans.modules.web.taglib.model.TagType;
import org.netbeans.modules.web.taglib.model.Taglib;
import org.netbeans.modules.web.taglib.model.ValidatorType;
import org.openide.filesystems.FileObject;
import org.openide.util.NbBundle;
/**
* A base class for rename refactorings in tld files.
*
* @author Erno Mononen
*/
abstract class BaseTldRename extends TldRefactoring{
protected final WebModule webModule;
public BaseTldRename(WebModule webModule) {
this.webModule = webModule;
}
/**
* @return the elements representing the classes that are affected
* by this refactoring.
*/
protected abstract List<RenameItem> getAffectedClasses();
protected abstract AbstractRefactoring getRefactoring();
public Problem prepare(RefactoringElementsBag refactoringElements) {
Problem problem = null;
for(TaglibHandle taglibHandle : getTaglibs(webModule)){
if (!taglibHandle.isValid()) {
problem = RefactoringUtil.addToEnd(new Problem(false,
NbBundle.getMessage(BaseTldRename.class, "TXT_TLdInvalidProblem", taglibHandle.getTldFile())),
problem);
continue;
}
Taglib taglib = taglibHandle.getTaglib();
for (RenameItem item : getAffectedClasses()){
String clazz = item.getOldFqn();
String newName = item.getNewFqn();
for (TagType tagType : taglib.getTag()){
if (clazz.equals(tagType.getTagClass())){
refactoringElements.add(getRefactoring(), new TagClassRenameElement(clazz, newName, tagType, taglib, taglibHandle.getTldFile()));
}
if (clazz.equals(tagType.getTeiClass())){
refactoringElements.add(getRefactoring(), new TeiClassRenameElement(clazz, newName, tagType, taglib, taglibHandle.getTldFile()));
}
}
for (FunctionType functionType : taglib.getFunction()){
if (clazz.equals(functionType.getFunctionClass())){
refactoringElements.add(getRefactoring(), new FunctionTypeRenameElement(clazz, newName, functionType, taglib, taglibHandle.getTldFile()));
}
}
ValidatorType validatorType = taglib.getValidator();
if (validatorType != null && clazz.equals(validatorType.getValidatorClass())){
refactoringElements.add(getRefactoring(), new ValidatorRenameElement(clazz, newName, validatorType, taglib, taglibHandle.getTldFile()));
}
for (ListenerType listenerType : taglib.getListener()){
if (clazz.equals(listenerType.getListenerClass())){
refactoringElements.add(getRefactoring(), new ListenerRenameElement(clazz, newName, listenerType, taglib, taglibHandle.getTldFile()));
}
}
}
}
return problem;
}
private static class TagClassRenameElement extends TldRefactoringElement{
private final String newName;
private final TagType tagType;
public TagClassRenameElement(String clazz, String newName, TagType tagType, Taglib taglib, FileObject tldFile) {
super(clazz, taglib, tldFile);
this.newName = newName;
this.tagType = tagType;
}
public String getDisplayText() {
return NbBundle.getMessage(TldRename.class, "TXT_TaglibTagClassRename", clazz, newName);
}
public void performChange() {
tagType.setTagClass(newName);
write();
}
@Override
public void undoChange() {
tagType.setTagClass(clazz);
write();
}
}
private static class TeiClassRenameElement extends TldRefactoringElement{
private final String newName;
private final TagType tagType;
public TeiClassRenameElement(String clazz, String newName, TagType tagType, Taglib taglib, FileObject tldFile) {
super(clazz, taglib, tldFile);
this.newName = newName;
this.tagType = tagType;
}
public String getDisplayText() {
return NbBundle.getMessage(TldRename.class, "TXT_TaglibTeiClassRename", clazz, newName);
}
public void performChange() {
tagType.setTeiClass(newName);
write();
}
@Override
public void undoChange() {
tagType.setTeiClass(clazz);
write();
}
}
private static class ValidatorRenameElement extends TldRefactoringElement{
private final String newName;
private final ValidatorType validatorType;
public ValidatorRenameElement(String clazz, String newName, ValidatorType validatorType, Taglib taglib, FileObject tldFile) {
super(clazz, taglib, tldFile);
this.newName = newName;
this.validatorType = validatorType;
}
public String getDisplayText() {
return NbBundle.getMessage(TldRename.class, "TXT_TaglibValidatorClassRename", clazz, newName);
}
public void performChange() {
validatorType.setValidatorClass(newName);
write();
}
@Override
public void undoChange() {
validatorType.setValidatorClass(clazz);
write();
}
}
private static class FunctionTypeRenameElement extends TldRefactoringElement{
private final String newName;
private final FunctionType functionType;
public FunctionTypeRenameElement(String clazz, String newName, FunctionType functionType, Taglib taglib, FileObject tldFile) {
super(clazz, taglib, tldFile);
this.newName = newName;
this.functionType = functionType;
}
public String getDisplayText() {
return NbBundle.getMessage(TldRename.class, "TXT_TaglibFunctionClassRename", clazz, newName);
}
public void performChange() {
functionType.setFunctionClass(newName);
write();
}
@Override
public void undoChange() {
functionType.setFunctionClass(clazz);
write();
}
}
private static class ListenerRenameElement extends TldRefactoringElement{
private final String newName;
private final ListenerType listenerType;
public ListenerRenameElement(String clazz, String newName, ListenerType listenerType, Taglib taglib, FileObject tldFile) {
super(clazz, taglib, tldFile);
this.newName = newName;
this.listenerType = listenerType;
}
public String getDisplayText() {
return NbBundle.getMessage(TldRename.class, "TXT_TaglibListenerClassRename", clazz, newName);
}
public void performChange() {
listenerType.setListenerClass(newName);
write();
}
@Override
public void undoChange() {
listenerType.setListenerClass(clazz);
write();
}
}
}