/* * Copyright (C) 2015 Servoy BV * * 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.servoy.j2db.server.ngclient; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import com.servoy.j2db.util.Settings; import com.servoy.j2db.util.Utils; import ro.isdc.wro.config.factory.PropertyWroConfigurationFactory; import ro.isdc.wro.config.jmx.WroConfiguration; import ro.isdc.wro.http.WroFilter; import ro.isdc.wro.manager.factory.BaseWroManagerFactory; import ro.isdc.wro.manager.factory.WroManagerFactory; import ro.isdc.wro.model.WroModel; import ro.isdc.wro.model.factory.WroModelFactory; import ro.isdc.wro.model.group.DefaultGroupExtractor; import ro.isdc.wro.model.group.Group; import ro.isdc.wro.model.group.GroupExtractor; import ro.isdc.wro.model.resource.Resource; import ro.isdc.wro.model.resource.ResourceType; import ro.isdc.wro.util.ObjectFactory; /** * @author gboros * */ @WebFilter(urlPatterns = { "/wro/*" }) @SuppressWarnings("nls") public class NGWroFilter extends WroFilter { public static final String WROFILTER = "wroFilter"; private boolean isMinimize; @Override protected void doInit(final FilterConfig config) throws ServletException { // can be used in servoy.properties file with 'system.property.' prefix); boolean enableWebResourceOptimizer = Utils.getAsBoolean(Settings.getInstance().getProperty("servoy.ngclient.enableWebResourceOptimizer", "false")); setEnable(enableWebResourceOptimizer); if (enableWebResourceOptimizer) config.getServletContext().setAttribute(WROFILTER, this); isMinimize = Utils.getAsBoolean(Settings.getInstance().getProperty("servoy.ngclient.enableWebResourceOptimizerMinimize", "false")); } @Override protected ObjectFactory<WroConfiguration> newWroConfigurationFactory(final FilterConfig filterConfig) { Properties p = new Properties(); p.setProperty("postProcessors", "jsMin,cssMin"); return new PropertyWroConfigurationFactory(p); } @Override protected WroManagerFactory newWroManagerFactory() { return new ConfigurationFreeManagerFactory(this); } class ConfigurationFreeModelFactory implements WroModelFactory { private final NGWroFilter ngWroFilter; ConfigurationFreeModelFactory(NGWroFilter ngWroFilter) { this.ngWroFilter = ngWroFilter; } public WroModel create() { WroModel result = new WroModel(); for (Group g : ngWroFilter.getContributionsGroups()) { result.addGroup(g); } return result; } public void destroy() { } } class ConfigurationFreeGroupExtractor implements GroupExtractor { private final DefaultGroupExtractor defaultExtractor = new DefaultGroupExtractor(); /** * Everything that follows context path is considered a group name. */ public String getGroupName(HttpServletRequest request) { String contextPath = request.getContextPath(); String uri = getUri(request); if (uri.startsWith(contextPath)) uri = uri.substring(contextPath.length()); return uri; } private String getUri(HttpServletRequest request) { // exactly the same implementation as in the default group extractor String includeUriPath = (String)request.getAttribute(DefaultGroupExtractor.ATTR_INCLUDE_PATH); String uri = request.getRequestURI(); uri = includeUriPath != null ? includeUriPath : uri; return uri; } public ResourceType getResourceType(HttpServletRequest request) { return defaultExtractor.getResourceType(request); } public boolean isMinimized(HttpServletRequest request) { return defaultExtractor.isMinimized(request); } public String encodeGroupUrl(String groupName, ResourceType resourceType, boolean minimize) { return groupName; } } class ConfigurationFreeManagerFactory extends BaseWroManagerFactory { private final NGWroFilter ngWroFilter; ConfigurationFreeManagerFactory(NGWroFilter ngWroFilter) { this.ngWroFilter = ngWroFilter; } @Override protected GroupExtractor newGroupExtractor() { return new ConfigurationFreeGroupExtractor(); } @Override protected WroModelFactory newModelFactory() { return new ConfigurationFreeModelFactory(ngWroFilter); } } private final ArrayList<Group> contributionsGroups = new ArrayList<Group>(); ArrayList<Group> getContributionsGroups() { return contributionsGroups; } public String createCSSGroup(String name, List<String> cssContributions) { return createGroup(name, cssContributions, ResourceType.CSS); } public String createJSGroup(String name, List<String> jsContributions) { return createGroup(name, jsContributions, ResourceType.JS); } private String createGroup(String name, List<String> contributions, ResourceType type) { Group g = new Group("/" + name); for (String s : contributions) { Resource r = new Resource(); r.setType(type); r.setUri("/" + s); r.setMinimize(isMinimize && !s.toLowerCase().endsWith(".min.js")); g.addResource(r); } contributionsGroups.add(g); return name; } }