blob: 714d67cfdce758e2783ebe111950be860fbeebe4 [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.jsf.richfaces;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.project.classpath.ProjectClassPathModifier;
import org.netbeans.api.project.libraries.Library;
import org.netbeans.api.project.libraries.LibraryManager;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.modules.web.jsf.api.JsfComponentUtils;
import org.netbeans.modules.web.jsf.api.facesmodel.JSFVersion;
import org.netbeans.modules.web.jsf.richfaces.ui.Richfaces4CustomizerPanelVisual;
import org.netbeans.modules.web.jsf.spi.components.JsfComponentCustomizer;
import org.netbeans.modules.web.jsf.spi.components.JsfComponentImplementation;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
/**
*
* @author Martin Fousek <marfous@netbeans.org>
*/
public class Richfaces4Implementation implements JsfComponentImplementation {
private static final Logger LOGGER = Logger.getLogger(Richfaces4Implementation.class.getName());
private Richfaces4Customizer customizer;
private static final String RICHFACES_NAME = "RichFaces"; //NOI18N
// ICEfaces Maven resources
private static final String MAVEN_REPO = "default:https://repository.jboss.org/nexus/content/groups/public-jboss/"; //NOI18N
private static final String MAVEN_DEP_CORE = "org.richfaces.core:richfaces-core-impl:4.3.3.Final:jar"; //NOI18N
private static final String MAVEN_DEP_UI = "org.richfaces.ui:richfaces-components-ui:4.3.3.Final:jar"; //NOI18N
public static final Set<String> RF_LIBRARIES = new HashSet<String>();
public static final Map<String, String> RF_DEPENDENCIES = new HashMap<String, String>();
public static final String PREF_RICHFACES_NODE = "richfaces"; //NOI18N
public static final String PREF_RICHFACES_LIBRARY = "base-library"; //NOI18N
static {
RF_LIBRARIES.add("org.richfaces.application.Module"); //NOI18N
RF_LIBRARIES.add("org.richfaces.application.ServiceLoader"); //NOI18N
RF_LIBRARIES.add("org.richfaces.el.ValueDescriptor"); //NOI18N
RF_LIBRARIES.add("org.richfaces.el.ValueReference"); //NOI18N
RF_DEPENDENCIES.put("com.google.common.base.Functions", "guava.jar"); //NOI18N
RF_DEPENDENCIES.put("org.w3c.css.sac.Parser", "sac.jar"); //NOI18N
RF_DEPENDENCIES.put("com.steadystate.css.parser.ParseException", "cssparser.jar"); //NOI18N
}
public Richfaces4Implementation() {
}
@Override
public String getName() {
return RICHFACES_NAME;
}
@NbBundle.Messages({
"Richfaces4Implementation.richfaces.display.name=RichFaces"
})
@Override
public String getDisplayName() {
return Bundle.Richfaces4Implementation_richfaces_display_name();
}
@Override
public String getDescription() {
return NbBundle.getMessage(Richfaces4Implementation.class, "LBL_RichFaces_Description"); //NOI18N
}
@Override
public void remove(WebModule webModule) {
try {
List<Library> richfacesLibraries;
if (JsfComponentUtils.isMavenBased(webModule)) {
richfacesLibraries = Arrays.asList(getMavenLibrary());
} else {
richfacesLibraries = Richfaces4Customizer.getRichfacesLibraries();
}
ProjectClassPathModifier.removeLibraries(richfacesLibraries.toArray(
new Library[richfacesLibraries.size()]), webModule.getJavaSources()[0], ClassPath.COMPILE);
} catch (IOException ex) {
LOGGER.log(Level.WARNING, "Exception during removing JSF suite from an web project", ex); //NOI18N
} catch (UnsupportedOperationException ex) {
LOGGER.log(Level.WARNING, "Exception during removing JSF suite from an web project", ex); //NOI18N
}
}
@Override
public Set<org.openide.filesystems.FileObject> extend(WebModule webModule, JsfComponentCustomizer jsfComponentCustomizer) {
// Add library to webmodule classpath
extendClasspath(webModule, jsfComponentCustomizer);
// generate Richfaces welcome page
try {
FileObject welcomePage = generateWelcomePage(webModule);
return Collections.singleton(welcomePage);
} catch (IOException ex) {
LOGGER.log(Level.WARNING, "Exception during welcome page creation", ex); //NOI18N
}
return Collections.<FileObject>emptySet();
}
private static void extendClasspath(WebModule webModule, JsfComponentCustomizer jsfComponentCustomizer) {
try {
List<Library> libraries = new ArrayList<Library>(1);
Library rfLibrary = null;
if (JsfComponentUtils.isMavenBased(webModule)) {
rfLibrary = getMavenLibrary();
} else {
// get the RF library from customizer
if (jsfComponentCustomizer != null) {
Richfaces4CustomizerPanelVisual panel = (Richfaces4CustomizerPanelVisual) jsfComponentCustomizer.getComponent();
rfLibrary = LibraryManager.getDefault().getLibrary(panel.getRichFacesLibrary());
}
// or search for library stored in Richfaces preferences
if (rfLibrary == null) {
Preferences preferences = getRichfacesPreferences();
rfLibrary = LibraryManager.getDefault().getLibrary(
preferences.get(Richfaces4Implementation.PREF_RICHFACES_LIBRARY, "")); //NOI18N
}
// otherwise search for any registered RF library in IDE
if (rfLibrary == null) {
rfLibrary = Richfaces4Customizer.getRichfacesLibraries().get(0);
}
}
if (rfLibrary != null) {
FileObject[] javaSources = webModule.getJavaSources();
libraries.add(rfLibrary);
ProjectClassPathModifier.addLibraries(
libraries.toArray(new Library[1]),
javaSources[0],
ClassPath.COMPILE);
} else {
LOGGER.log(Level.SEVERE, "No RichFaces library was found.");
}
} catch (IOException ex) {
LOGGER.log(Level.WARNING, "Exception during extending an web project", ex); //NOI18N
} catch (UnsupportedOperationException ex) {
LOGGER.log(Level.WARNING, "Exception during extending an web project", ex); //NOI18N
}
}
private static Library getMavenLibrary() {
return JsfComponentUtils.createMavenDependencyLibrary(
RICHFACES_NAME + "-maven-lib", //NOI18N
new String[]{MAVEN_DEP_CORE, MAVEN_DEP_UI},
new String[]{MAVEN_REPO});
}
private static FileObject generateWelcomePage(WebModule webModule) throws IOException {
FileObject templateFO = FileUtil.getConfigFile("Templates/Other/welcomeRichfaces.xhtml"); //NOI18N
DataObject templateDO = DataObject.find(templateFO);
DataObject generated = templateDO.createFromTemplate(
DataFolder.findFolder(webModule.getDocumentBase()),
"welcomeRichfaces"); //NOI18N
JsfComponentUtils.reformat(generated);
// update and reformat index page
updateIndexPage(webModule);
return generated.getPrimaryFile();
}
private static void updateIndexPage(WebModule webModule) throws DataObjectNotFoundException {
FileObject documentBase = webModule.getDocumentBase();
if (documentBase != null) {
FileObject indexFO = documentBase.getFileObject("index.xhtml"); //NOI18N
if (indexFO != null) {
DataObject indexDO = DataObject.find(indexFO);
JsfComponentUtils.enhanceFileBody(indexDO, "</h:body>", "<br />\n<h:link outcome=\"welcomeRichfaces\" value=\"Richfaces welcome page\" />"); //NOI18N
if (indexFO.isValid() && indexFO.canWrite()) {
JsfComponentUtils.reformat(indexDO);
}
}
}
}
@Override
public Set<JSFVersion> getJsfVersion() {
return EnumSet.of(JSFVersion.JSF_2_0, JSFVersion.JSF_2_1, JSFVersion.JSF_2_2);
}
@Override
public boolean isInWebModule(org.netbeans.modules.web.api.webmodule.WebModule webModule) {
ClassPath classpath = ClassPath.getClassPath(webModule.getDocumentBase(), ClassPath.COMPILE);
Iterator<String> iterator = RF_LIBRARIES.iterator();
while (iterator.hasNext()) {
String libraryName = iterator.next();
if (classpath.findResource(libraryName.replace('.', '/') + ".class") == null) { //NOI18N
return false;
}
}
return true;
}
@Override
public JsfComponentCustomizer createJsfComponentCustomizer(WebModule webModule) {
if (customizer == null) {
customizer = new Richfaces4Customizer();
}
return customizer;
}
/**
* Gets {@link Preferences} for RichFaces4.
*
* @return {@code Preferences} of the RichFaces4
*/
public static Preferences getRichfacesPreferences() {
return NbPreferences.forModule(Richfaces4Implementation.class).
node(Richfaces4Implementation.PREF_RICHFACES_NODE);
}
}