/*
* Copyright 2015 The authors
* 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 com.intellij.struts2;
import com.intellij.facet.FacetManager;
import com.intellij.facet.impl.FacetUtil;
import com.intellij.javaee.DeploymentDescriptorsConstants;
import com.intellij.javaee.web.facet.WebFacet;
import com.intellij.javaee.web.facet.WebFacetType;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.struts2.facet.StrutsFacetType;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor;
import com.intellij.util.SmartList;
import com.intellij.util.descriptors.ConfigFileInfoSet;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* Re-use (static) instances across as many tests as possible.
* <p/>
* Make sure to update equals/hashCode for any modifications in this class.
*
* @author Yann Cébron
*/
public final class Struts2ProjectDescriptorBuilder extends DefaultLightProjectDescriptor {
private boolean addStrutsLibrary;
private boolean addJ2eeLibrary;
private boolean addStrutsFacet;
private String webXmlUrl;
private final List<LibraryDefinition> libraries = new SmartList<>();
private final List<Callback> callbacks = new SmartList<>();
public Struts2ProjectDescriptorBuilder withWebModuleType(String testDataRoot) {
webXmlUrl = VfsUtilCore.pathToUrl(testDataRoot + "/WEB-INF/web.xml");
return this;
}
public Struts2ProjectDescriptorBuilder withStrutsLibrary() {
addStrutsLibrary = true;
return this;
}
public Struts2ProjectDescriptorBuilder withStrutsFacet() {
addStrutsFacet = true;
return this;
}
public Struts2ProjectDescriptorBuilder withCallback(Callback callback) {
callbacks.add(callback);
return this;
}
public Struts2ProjectDescriptorBuilder withLibrary(String name, String... artifactIds) {
libraries.add(new LibraryDefinition(name, artifactIds));
return this;
}
public Struts2ProjectDescriptorBuilder withJ2eeLibrary() {
addJ2eeLibrary = true;
return this;
}
public LightProjectDescriptor build() {
return this;
}
@Override
public Sdk getSdk() {
Sdk sdk = IdeaTestUtil.getMockJdk18();
if (webXmlUrl != null) {
sdk=IdeaTestUtil.addWebJarsTo(sdk);
}
return sdk;
}
@Override
public void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ContentEntry contentEntry) {
super.configureModule(module, model, contentEntry);
if (addStrutsLibrary) {
BasicLightHighlightingTestCase.addStrutsJars(module, model);
}
if (addJ2eeLibrary) {
PsiTestUtil.addLibrary(module, model, "JavaEE", PathManager.getHomePath() + "/lib/", "javaee.jar", "javase-javax.jar");
}
for (LibraryDefinition library : libraries) {
BasicLightHighlightingTestCase.addLibrary(module, model, library.groupId, library.artifactIds);
}
final WebFacet webFacet = FacetUtil.addFacet(module, WebFacetType.getInstance());
if (addStrutsFacet) {
FacetManager.getInstance(module).addFacet(StrutsFacetType.getInstance(), "struts2", webFacet);
}
if (webXmlUrl != null) {
final VirtualFile root = model.getSourceRoots()[0];
webFacet.addWebRoot(root, "/");
final ConfigFileInfoSet descriptors = webFacet.getDescriptorsContainer().getConfiguration();
descriptors.addConfigFile(DeploymentDescriptorsConstants.WEB_XML_META_DATA, webXmlUrl);
for (String url : ModuleRootManager.getInstance(module).getSourceRootUrls()) {
webFacet.addWebSourceRoot(url);
}
}
for (Callback callback : callbacks) {
callback.configureModule(module, model, contentEntry);
}
}
/**
* Performs custom initialization.
*/
public abstract static class Callback {
protected abstract void configureModule(Module module, ModifiableRootModel model, ContentEntry contentEntry);
@Override
public final int hashCode() {
return this.getClass().hashCode();
}
@Override
public final boolean equals(Object obj) {
return obj instanceof Callback && obj.hashCode() == hashCode();
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Struts2ProjectDescriptorBuilder builder = (Struts2ProjectDescriptorBuilder)o;
if (addStrutsLibrary != builder.addStrutsLibrary) return false;
if (addJ2eeLibrary != builder.addJ2eeLibrary) return false;
if (addStrutsFacet != builder.addStrutsFacet) return false;
if (webXmlUrl != null ? !webXmlUrl.equals(builder.webXmlUrl) : builder.webXmlUrl != null) return false;
if (!callbacks.equals(builder.callbacks)) return false;
if (!libraries.equals(builder.libraries)) return false;
return true;
}
@Override
public int hashCode() {
int result = (addStrutsLibrary ? 1 : 0);
result = 31 * result + (addStrutsFacet ? 1 : 0);
result = 31 * result + (addJ2eeLibrary ? 1 : 0);
result = 31 * result + (webXmlUrl != null ? webXmlUrl.hashCode() : 0);
result = 31 * result + libraries.hashCode();
result = 31 * result + callbacks.hashCode();
return result;
}
private static class LibraryDefinition {
private final String groupId;
private final String[] artifactIds;
private LibraryDefinition(String groupId, String[] artifactIds) {
this.groupId = groupId;
this.artifactIds = artifactIds;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LibraryDefinition that = (LibraryDefinition)o;
if (!Arrays.equals(artifactIds, that.artifactIds)) return false;
if (!groupId.equals(that.groupId)) return false;
return true;
}
@Override
public int hashCode() {
int result = groupId.hashCode();
result = 31 * result + Arrays.hashCode(artifactIds);
return result;
}
}
}