blob: ba9657cc408975f9668a5f69b8c9e13ade83dc25 [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.websvc.rest.spi;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.api.j2ee.core.Profile;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.project.classpath.ProjectClassPathModifier;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.modules.j2ee.dd.api.web.WebApp;
import org.netbeans.modules.j2ee.dd.spi.MetadataUnit;
import org.netbeans.modules.j2ee.metadata.model.api.MetadataModelAction;
import org.netbeans.modules.j2ee.persistence.api.PersistenceScope;
import org.netbeans.modules.javaee.specs.support.api.JaxRsStackSupport;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.modules.websvc.jaxws.api.JAXWSSupport;
import org.netbeans.modules.websvc.jaxws.spi.JAXWSSupportProvider;
import org.netbeans.modules.websvc.rest.ApplicationSubclassGenerator;
import org.netbeans.modules.websvc.rest.MiscPrivateUtilities;
import org.netbeans.modules.websvc.rest.WebXmlUpdater;
import org.netbeans.modules.websvc.rest.model.api.RestApplication;
import org.netbeans.modules.websvc.rest.model.api.RestApplicationModel;
import org.netbeans.modules.websvc.rest.model.api.RestApplications;
import org.netbeans.modules.websvc.rest.model.api.RestServicesModel;
import org.netbeans.modules.websvc.rest.model.spi.RestServicesMetadataModelFactory;
import org.netbeans.spi.java.classpath.ClassPathProvider;
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
import org.netbeans.spi.project.support.ant.AntProjectHelper;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.modules.InstalledFileLocator;
import org.openide.util.Exceptions;
import org.openide.util.Mutex;
import org.openide.util.MutexException;
import org.openide.util.RequestProcessor;
/**
* All development project type supporting REST framework should provide
* one instance of this in project lookup.
*
* @author Nam Nguyen
*/
public abstract class RestSupport {
public static final String SWDP_LIBRARY = "restlib"; //NOI18N
public static final String RESTAPI_LIBRARY = "restapi"; //NOI18N
protected static final String GFV3_RESTLIB = "restlib_gfv3ee6"; // NOI18N
protected static final String GFV31_RESTLIB = "restlib_gfv31ee6"; // NOI18N
public static final String PROP_SWDP_CLASSPATH = "libs.swdp.classpath"; //NOI18N
public static final String PROP_RESTBEANS_TEST_DIR = "restbeans.test.dir"; //NOI18N
public static final String PROP_RESTBEANS_TEST_FILE = "restbeans.test.file";//NOI18N
public static final String PROP_RESTBEANS_TEST_URL = "restbeans.test.url";//NOI18N
public static final String PROP_BASE_URL_TOKEN = "base.url.token";//NOI18N
public static final String PROP_APPLICATION_PATH = "rest.application.path";//NOI18N
public static final String BASE_URL_TOKEN = "___BASE_URL___";//NOI18N
public static final String RESTBEANS_TEST_DIR = "build/generated-sources/rest-test";//NOI18N
public static final String COMMAND_TEST_RESTBEANS = "test-restbeans";//NOI18N
public static final String COMMAND_DEPLOY = "run-deploy";//NOI18N
public static final String TEST_RESBEANS = "test-resbeans";//NOI18N
public static final String TEST_RESBEANS_HTML = TEST_RESBEANS + ".html";//NOI18N
public static final String TEST_RESBEANS_JS = TEST_RESBEANS + ".js";
public static final String TEST_RESBEANS_CSS = TEST_RESBEANS + ".css";//NOI18N
public static final String TEST_RESBEANS_CSS2 = "css_master-all.css";//NOI18N
public static final String REST_SERVLET_ADAPTOR = "ServletAdaptor";//NOI18N
public static final String JAX_RS_APPLICATION_CLASS = "javax.ws.rs.core.Application"; //NOI18N
public static final String REST_SERVLET_ADAPTOR_CLASS = "com.sun.jersey.spi.container.servlet.ServletContainer"; //NOI18N
public static final String REST_SERVLET_ADAPTOR_CLASS_OLD = "com.sun.ws.rest.impl.container.servlet.ServletAdaptor"; //NOI18N
public static final String REST_SERVLET_ADAPTOR_CLASS_2_0 = "org.glassfish.jersey.servlet.ServletContainer"; //NOI18N
public static final String REST_SPRING_SERVLET_ADAPTOR_CLASS = "com.sun.jersey.spi.spring.container.servlet.SpringServlet"; //NOI18N
public static final String REST_SERVLET_ADAPTOR_MAPPING = "/resources/*";//NOI18N
public static final String PARAM_WEB_RESOURCE_CLASS = "webresourceclass";//NOI18N
public static final String WEB_RESOURCE_CLASS = "webresources.WebResources";//NOI18N
public static final String REST_API_JAR = "jsr311-api.jar";//NOI18N
public static final String REST_RI_JAR = "jersey";//NOI18N
//public static final String IGNORE_PLATFORM_RESTLIB = "restlib.ignore.platform";//NOI18N
public static final String JSR311_JAR_PATTERN = "jsr311-api.*\\.jar";//NOI18N
public static final String JERSEY_API_LOCATION = "modules/ext/rest";//NOI18N
public static final String JTA_USER_TRANSACTION_CLASS = "javax/transaction/UserTransaction.class"; //NOI18
public static final String J2EE_SERVER_TYPE = "j2ee.server.type"; //NOI18N
public static final String TOMCAT_SERVER_TYPE = "tomcat"; //NOI18N
public static final String GFV3_SERVER_TYPE = "gfv3"; //NOI18N
public static final String GFV2_SERVER_TYPE = "J2EE"; //NOI18N
public static final int PROJECT_TYPE_DESKTOP = 0; //NOI18N
public static final int PROJECT_TYPE_WEB = 1; //NOI18N
public static final int PROJECT_TYPE_NB_MODULE = 2; //NOI18N
public static final String PROP_REST_RESOURCES_PATH = "rest.resources.path";//NOI18N
public static final String PROP_REST_CONFIG_TYPE = "rest.config.type"; //NOI18N
public static final String PROP_REST_JERSEY = "rest.jersey.type"; //NOI18N
// IDE generates Application subclass
public static final String CONFIG_TYPE_IDE = "ide"; //NOI18N
// user does everything manually
public static final String CONFIG_TYPE_USER= "user"; //NOI18N
// Jersey servlet is registered in deployment descriptor
public static final String CONFIG_TYPE_DD= "dd"; //NOI18N
public static final String JERSEY_CONFIG_IDE="ide"; //NOI18N
public static final String JERSEY_CONFIG_SERVER="server"; //NOI18N
public static final String CONTAINER_RESPONSE_FILTER = "com.sun.jersey.spi.container.ContainerResponseFilters";//NOI18N
protected static final String JERSEY_SPRING_JAR_PATTERN = "jersey-spring.*\\.jar";//NOI18N
private volatile PropertyChangeListener restModelListener;
private RequestProcessor RP = new RequestProcessor(RestSupport.class);
private AntProjectHelper helper;
private RestServicesModel restServicesModel;
private RestApplicationModel restApplicationModel;
private final Project project;
private ApplicationSubclassGenerator applicationSubclassGenerator;
private WebXmlUpdater webXmlUpdater;
/** Creates a new instance of RestSupport */
public RestSupport(Project project) {
if (project == null) {
throw new IllegalArgumentException("Null project");
}
this.project = project;
applicationSubclassGenerator = new ApplicationSubclassGenerator(this);
webXmlUpdater = new WebXmlUpdater(this);
RP.post(new Runnable() {
@Override
public void run() {
String configType = getProjectProperty(PROP_REST_CONFIG_TYPE);
if (CONFIG_TYPE_IDE.equals(configType)) {
initListener();
}
}
});
}
private void initListener() {
if ( restModelListener == null ){
restModelListener = new PropertyChangeListener() {
@Override
public void propertyChange( PropertyChangeEvent evt ) {
applicationSubclassGenerator.refreshApplicationSubclass();
}
};
RestServicesModel servicesModel = getRestServicesModel();
if (servicesModel != null) {
servicesModel.addPropertyChangeListener(restModelListener);
}
}
}
/**
* Ensure the project is ready for REST development.
* Typical implementation would need to invoke addSwdpLibraries
* REST development with servlet container would need to add servlet adaptor
* to web.xml.
*/
public final void ensureRestDevelopmentReady(final RestConfig restConfig) throws IOException {
assert restConfig != null;
if (isRestSupportOn()) {
return;
}
setProjectProperty(PROP_REST_CONFIG_TYPE, restConfig == RestConfig.DD ? CONFIG_TYPE_DD : CONFIG_TYPE_IDE);
RP.post(new Runnable() {
@Override
public void run() {
try {
ensureRestDevelopmentReadyImpl(restConfig);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
});
}
private void ensureRestDevelopmentReadyImpl(RestConfig restConfig) throws IOException {
// check whether project EE level or project/server classpath provide
// JAX-RS APIs. The value should be false only in case of EE5 specification
// and server without any Jersey on its classpath, eg. Tomcat or some
// very very old GF (v2? or older)
// extend build script if necessary
extendBuildScripts();
boolean hasJersey2 = hasJersey2(true);
boolean hasJaxRsOnClasspath = hasJaxRsOnClasspath(false);
final boolean hasJaxRs = isEESpecWithJaxRS() || hasJaxRsOnClasspath ||
hasJersey1(true) || hasJersey2;
if (isEE5() && (hasJersey2 || !hasJaxRs)) {
webXmlUpdater.addJersey2ResourceConfigToWebApp(restConfig);
}
// add latest JAX-RS APIs to project's classpath:
if (!hasJaxRs || !hasJaxRsOnClasspath) {
boolean jaxRSApiAdded = false;
JaxRsStackSupport support = getJaxRsStackSupport();
if (support != null) {
// in this case server is enhancing project's classpath:
jaxRSApiAdded = support.addJsr311Api(getProject());
}
if (!jaxRSApiAdded) {
// fallback on IDE's default impl if server does not have its own
// jax-rs impl:
JaxRsStackSupport.getDefault().addJsr311Api(getProject());
}
}
// make sure the project classpath contains Jersey JARs:
if (!hasJersey2 && !hasJersey1(true)) {
extendJerseyClasspath();
}
handleSpring();
ProjectManager.getDefault().saveProject(getProject());
}
protected void extendJerseyClasspath() {
JaxRsStackSupport support = getJaxRsStackSupport();
boolean jerseyAdded = false;
if (support != null) {
jerseyAdded = support.extendsJerseyProjectClasspath(getProject());
}
// fallback on IDE's default library:
if (!jerseyAdded){
JaxRsStackSupport.getDefault().extendsJerseyProjectClasspath(getProject());
}
}
protected abstract void extendBuildScripts() throws IOException;
protected abstract void handleSpring() throws IOException;
public abstract String getApplicationPathFromDialog(List<RestApplication> restApplications);
public synchronized RestServicesModel getRestServicesModel() {
if (restServicesModel == null) {
FileObject sourceRoot = MiscUtilities.findSourceRoot(getProject());
if (sourceRoot == null) {
return null;
}
ClassPathProvider cpProvider = getProject().getLookup().lookup(ClassPathProvider.class);
if (cpProvider != null) {
ClassPath compileCP = cpProvider.findClassPath(sourceRoot, ClassPath.COMPILE);
ClassPath bootCP = cpProvider.findClassPath(sourceRoot, ClassPath.BOOT);
ClassPath sourceCP = cpProvider.findClassPath(sourceRoot, ClassPath.SOURCE);
if (compileCP != null && bootCP != null) {
MetadataUnit metadataUnit = MetadataUnit.create(
bootCP,
extendClassPathWithJaxRsApisIfNecessary(compileCP),
sourceCP,
null);
restServicesModel = RestServicesMetadataModelFactory.
createMetadataModel(metadataUnit, project);
}
}
}
return restServicesModel;
}
public synchronized RestApplicationModel getRestApplicationsModel() {
if (restApplicationModel == null) {
MetadataUnit metadataUnit = MetadataUnit.create(
MiscPrivateUtilities.getClassPath(getProject(), ClassPath.BOOT),
MiscPrivateUtilities.getClassPath(getProject(), ClassPath.COMPILE),
MiscPrivateUtilities.getClassPath(getProject(), ClassPath.SOURCE),
null
);
restApplicationModel = RestServicesMetadataModelFactory.
createApplicationMetadataModel(metadataUnit, project);
}
return restApplicationModel;
}
private static ClassPath extendClassPathWithJaxRsApisIfNecessary(ClassPath classPath) {
if (classPath.findResource("javax/ws/rs/core/Application.class") != null) {
return classPath;
}
File jerseyRoot = InstalledFileLocator.getDefault().locate(JERSEY_API_LOCATION, "org.netbeans.modules.websvc.restlib", false);
if (jerseyRoot != null && jerseyRoot.isDirectory()) {
File[] jsr311Jars = jerseyRoot.listFiles(new MiscPrivateUtilities.JerseyFilter(JSR311_JAR_PATTERN));
if (jsr311Jars != null && jsr311Jars.length>0) {
FileObject fo = FileUtil.toFileObject(jsr311Jars[0]);
if (fo != null) {
fo = FileUtil.getArchiveRoot(fo);
if (fo != null) {
return ClassPathSupport.createProxyClassPath(classPath,
ClassPathSupport.createClassPath(fo));
}
}
}
}
return classPath;
}
public abstract FileObject generateTestClient(File testdir, String url)
throws IOException;
public Project getProject() {
return project;
}
public void setProjectProperty(String name, String value) {
MiscPrivateUtilities.setProjectProperty(getProject(), getAntProjectHelper(), name, value, AntProjectHelper.PROJECT_PROPERTIES_PATH);
}
public void setPrivateProjectProperty(String name, String value) {
MiscPrivateUtilities.setProjectProperty(getProject(), getAntProjectHelper(), name, value, AntProjectHelper.PRIVATE_PROPERTIES_PATH );
}
public String getProjectProperty(String name) {
if (getAntProjectHelper() == null) {
return null;
}
return helper.getStandardPropertyEvaluator().getProperty(name);
}
public void removeProjectProperties(final String[] propertyNames) {
if (getAntProjectHelper() == null) {
return;
}
try {
ProjectManager.mutex().writeAccess(new Mutex.ExceptionAction() {
@Override
public Object run() throws IOException {
// and save the project
try {
MiscPrivateUtilities.removeProperty(getAntProjectHelper(), propertyNames,
AntProjectHelper.PROJECT_PROPERTIES_PATH);
MiscPrivateUtilities.removeProperty(getAntProjectHelper(), propertyNames,
AntProjectHelper.PRIVATE_PROPERTIES_PATH );
ProjectManager.getDefault().saveProject(getProject());
}
catch(IOException ioe) {
Logger.getLogger(this.getClass().getName()).log(Level.INFO, ioe.getLocalizedMessage(), ioe);
}
return null;
}
});
}
catch (MutexException e) {
Logger.getLogger(this.getClass().getName()).log(Level.INFO, null, e);
}
}
public AntProjectHelper getAntProjectHelper() {
if (helper == null) {
JAXWSSupportProvider provider = project.getLookup().lookup(JAXWSSupportProvider.class);
if (provider != null) {
JAXWSSupport support = provider.findJAXWSSupport(project.getProjectDirectory());
if (support != null) {
helper = support.getAntProjectHelper();
}
}
}
return helper;
}
/**
* Check to see if there is JTA support.
*/
public boolean hasJTASupport() {
return MiscPrivateUtilities.hasResource(getProject(), "javax/transaction/UserTransaction.class"); // NOI18N
}
/**
* Check to see if there is Spring framework support.
*
*/
public boolean hasSpringSupport() {
return MiscPrivateUtilities.hasResource(getProject(), "org/springframework/transaction/annotation/Transactional.class"); // NOI18N
}
public String getServerType() {
return getProjectProperty(J2EE_SERVER_TYPE);
}
public boolean isServerTomcat() {
String serverType = getServerType();
if (serverType != null) {
return serverType.toLowerCase().contains(TOMCAT_SERVER_TYPE);
}
return false;
}
public boolean isServerGFV3() {
if ( getServerType() == null ){
return false;
}
return getServerType().startsWith(GFV3_SERVER_TYPE);
}
public boolean isServerGFV2() {
return GFV2_SERVER_TYPE.equals(getServerType());
}
public abstract File getLocalTargetTestRest();
public String getBaseURL() {
String applicationPath = getApplicationPath();
if (applicationPath != null) {
if (!applicationPath.startsWith("/")) {
applicationPath = "/"+applicationPath;
}
}
return MiscUtilities.getContextRootURL(getProject())+"||"+applicationPath; //NOI18N
}
public abstract void deploy() throws IOException;
public boolean isRestSupportOn() {
if (getAntProjectHelper() == null) {
return false;
}
return getProjectProperty(PROP_REST_CONFIG_TYPE) != null;
}
/**
* Get persistence.xml file.
*/
public FileObject getPersistenceXml() {
PersistenceScope ps = PersistenceScope.getPersistenceScope(getProject().getProjectDirectory());
if (ps != null) {
return ps.getPersistenceXml();
}
return null;
}
/** Get deployment descriptor (DD API root bean)
*
* @return WebApp bean
* @throws java.io.IOException
*/
public WebApp getWebApp() throws IOException {
return webXmlUpdater.findWebApp();
}
WebXmlUpdater getWebXmlUpdater() {
return webXmlUpdater;
}
public boolean hasServerJerseyLibrary(){
return JaxRsStackSupport.getInstance(project) != null;
}
public JaxRsStackSupport getJaxRsStackSupport(){
return JaxRsStackSupport.getInstance(project);
}
/**
* Returns true if JAX-RS APIs are available for the project. That means if
* project's profile is EE7 (web profile or full) or EE6 (full).
*/
public boolean isEESpecWithJaxRS(){
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
boolean isJee6 = Profile.JAVA_EE_6_WEB.equals(profile) ||
Profile.JAVA_EE_6_FULL.equals(profile);
boolean isJee7 = Profile.JAVA_EE_7_WEB.equals(profile) ||
Profile.JAVA_EE_7_FULL.equals(profile);
boolean isJee8 = Profile.JAVA_EE_8_WEB.equals(profile) ||
Profile.JAVA_EE_8_FULL.equals(profile);
boolean isJakartaee8 = Profile.JAKARTA_EE_8_WEB.equals(profile) ||
Profile.JAKARTA_EE_8_FULL.equals(profile);
boolean isJakartaee9 = Profile.JAKARTA_EE_9_WEB.equals(profile) ||
Profile.JAKARTA_EE_9_FULL.equals(profile);
boolean isJakartaee91 = Profile.JAKARTA_EE_9_1_WEB.equals(profile) ||
Profile.JAKARTA_EE_9_1_FULL.equals(profile);
// Fix for BZ#216345: JAVA_EE_6_WEB profile doesn't contain JAX-RS API
return (isJee6 && MiscPrivateUtilities.supportsTargetProfile(project, Profile.JAVA_EE_6_FULL)) || isJee7 || isJee8 || isJakartaee8 || isJakartaee9 || isJakartaee91;
}
/**
* Is this JAKARTAEE9 profile project?
*/
public boolean isJakartaEE91() {
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAKARTA_EE_9_1_WEB.equals(profile) ||
Profile.JAKARTA_EE_9_1_FULL.equals(profile);
}
/**
* Is this JAKARTAEE9 profile project?
*/
public boolean isJakartaEE9() {
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAKARTA_EE_9_WEB.equals(profile) ||
Profile.JAKARTA_EE_9_FULL.equals(profile);
}
/**
* Is this JAKARTAEE8 profile project?
*/
public boolean isJakartaEE8() {
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAKARTA_EE_8_WEB.equals(profile) ||
Profile.JAKARTA_EE_8_FULL.equals(profile);
}
/**
* Is this EE8 profile project?
*/
public boolean isEE8(){
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAVA_EE_8_WEB.equals(profile) ||
Profile.JAVA_EE_8_FULL.equals(profile);
}
/**
* Is this EE7 profile project?
*/
public boolean isEE7(){
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAVA_EE_7_WEB.equals(profile) ||
Profile.JAVA_EE_7_FULL.equals(profile);
}
/**
* Is this EE6 profile project?
*/
public boolean isEE6(){
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAVA_EE_6_WEB.equals(profile) ||
Profile.JAVA_EE_6_FULL.equals(profile);
}
public boolean isEE5(){
WebModule webModule = WebModule.getWebModule(project.getProjectDirectory());
if ( webModule == null ){
return false;
}
Profile profile = webModule.getJ2eeProfile();
return Profile.JAVA_EE_5.equals(profile);
}
/**
* Is Jersey 2.x jar available on project's classpath or on classpath of
* server used by this project?
*/
public boolean hasJersey2(boolean checkServerClasspath) {
if (MiscPrivateUtilities.hasResource(getProject(), "org/glassfish/jersey/servlet/ServletContainer.class")) {
return true;
}
if (checkServerClasspath) {
JaxRsStackSupport support = getJaxRsStackSupport();
if (support != null){
return support.isBundled(REST_SERVLET_ADAPTOR_CLASS_2_0);
}
}
return false;
}
/**
* Is Jersey 12.x jar available on project's classpath or on classpath of
* server used by this project?
*/
public boolean hasJersey1(boolean checkServerClasspath) {
if (MiscPrivateUtilities.hasResource(getProject(), "com/sun/jersey/spi/container/servlet/ServletContainer.class")) {
return true;
}
if (checkServerClasspath) {
JaxRsStackSupport support = getJaxRsStackSupport();
if (support != null){
return support.isBundled(REST_SERVLET_ADAPTOR_CLASS);
}
}
return false;
}
public boolean hasJaxRsOnClasspath(boolean checkServerClasspath) {
if (MiscPrivateUtilities.hasResource(getProject(), "javax/ws/rs/core/Application.class")) {
return true;
}
if (checkServerClasspath) {
JaxRsStackSupport support = getJaxRsStackSupport();
if (support != null){
return support.isBundled(JAX_RS_APPLICATION_CLASS);
}
}
return false;
}
/*
* Make REST support configuration for current porject state:
* - Modify Application config class getClasses() method
* or
* - Update deployment descriptor with Jersey specific options
*/
public void configure(String... packages) throws IOException {
String configType = getProjectProperty(PROP_REST_CONFIG_TYPE);
if ( CONFIG_TYPE_DD.equals( configType)){
webXmlUpdater.configRestPackages(packages);
}
else if (CONFIG_TYPE_IDE.equals(configType)) {
initListener();
applicationSubclassGenerator.refreshApplicationSubclass();
}
}
public String getApplicationPath() {
String pathFromDD = MiscUtilities.getApplicationPathFromDD(webXmlUpdater.findWebApp());
String applPath = ApplicationSubclassGenerator.getApplicationPathFromAnnotations(this, pathFromDD);
return (applPath == null ? "webresources" : applPath);
}
/** log rest resource detection
*
* @param prj project instance
*/
public abstract void logResourceCreation();
public List<RestApplication> getRestApplications() {
RestApplicationModel applicationModel = getRestApplicationsModel();
if (applicationModel != null) {
try {
return applicationModel.runReadAction(
new MetadataModelAction<RestApplications, List<RestApplication>>() {
public List<RestApplication> run(RestApplications metadata)
throws IOException {
return metadata.getRestApplications();
}
});
} catch (IOException ex) {
return Collections.emptyList();
}
}
return Collections.emptyList();
}
public boolean hasJerseyServlet() {
return WebXmlUpdater.hasRestServletAdaptor(webXmlUpdater.findWebApp());
}
protected void addJerseySpringJar() throws IOException {
FileObject srcRoot = MiscUtilities.findSourceRoot(getProject());
if (srcRoot != null) {
ClassPath cp = ClassPath.getClassPath(srcRoot, ClassPath.COMPILE);
if (cp ==null ||cp.findResource(
"com/sun/jersey/api/spring/Autowire.class") == null) //NOI18N
{
File jerseyRoot = InstalledFileLocator.getDefault().locate(JERSEY_API_LOCATION, null, false);
if (jerseyRoot != null && jerseyRoot.isDirectory()) {
File[] jerseyJars = jerseyRoot.listFiles(new MiscPrivateUtilities.JerseyFilter(JERSEY_SPRING_JAR_PATTERN));
if (jerseyJars != null && jerseyJars.length>0) {
URL url = FileUtil.getArchiveRoot(jerseyJars[0].toURI().toURL());
ProjectClassPathModifier.addRoots(new URL[] {url}, srcRoot, ClassPath.COMPILE);
}
}
}
}
}
public int getProjectType() {
return PROJECT_TYPE_WEB;
}
public static enum RestConfig {
// Application subclass registration:
IDE,
// this type is not used anymore but kept for existing projects
USER,
// web.xml deployment descriptor registration
DD;
// application class-name (useful only for IDE config type)
private String appClassName;
public void setAppClassName(String appClassName) {
this.appClassName = appClassName;
}
public String getAppClassName() {
return appClassName;
}
}
}