Author: hoang_to
Date: 2010-08-20 03:46:53 -0400 (Fri, 20 Aug 2010)
New Revision: 3877
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/BaseResourceCompressorPlugin.java
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressor.java
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorException.java
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorPlugin.java
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceType.java
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/JSMinCompressorPlugin.java
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/ResourceCompressorService.java
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/common/compressor-configuration.xml
Modified:
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/configuration.xml
Log:
GTNPORTAL-1420: Implement a resource compressor service that allow compressor pluggable
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/BaseResourceCompressorPlugin.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/BaseResourceCompressorPlugin.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/BaseResourceCompressorPlugin.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+import org.exoplatform.container.component.BaseComponentPlugin;
+
+/**
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public abstract class BaseResourceCompressorPlugin extends BaseComponentPlugin implements
ResourceCompressorPlugin
+{
+
+ abstract public ResourceType getResourceType();
+
+ @Override
+ public int getPriority()
+ {
+ return 0;
+ }
+
+ @Override
+ public void compress(Reader input, Writer output) throws ResourceCompressorException,
IOException
+ {
+ }
+
+ @Override
+ public String getName()
+ {
+ return this.getClass().getCanonicalName().toString();
+ }
+}
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressor.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressor.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressor.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * ResourceCompressor acts as a router of compression to compressor plugin
+ *
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public interface ResourceCompressor
+{
+
+ public void compress(Reader input, Writer output, ResourceType resourceType) throws
ResourceCompressorException,
+ IOException;
+
+}
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorException.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorException.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorException.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor;
+
+/**
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public class ResourceCompressorException extends RuntimeException
+{
+
+}
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorPlugin.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorPlugin.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceCompressorPlugin.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public interface ResourceCompressorPlugin
+{
+
+ /**
+ * Return resource type this plugin could compress.
+ *
+ * @return
+ */
+ public ResourceType getResourceType();
+
+ /**
+ * Return priority of plugin.
+ *
+ * @return
+ */
+ public int getPriority();
+
+ /**
+ * Return name of the plugin
+ *
+ * @return
+ */
+ public String getName();
+
+ /**
+ *
+ * Compress the specified input and produce compressed output.
+ *
+ * @param input
+ * @param output
+ * @throws ResourceCompressorException
+ * @throws IOException
+ */
+ public void compress(Reader input, Writer output) throws ResourceCompressorException,
IOException;
+}
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceType.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceType.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/ResourceType.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor;
+
+/**
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public enum ResourceType {
+
+ JAVASCRIPT, STYLESHEET;
+
+}
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/JSMinCompressorPlugin.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/JSMinCompressorPlugin.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/JSMinCompressorPlugin.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+import org.exoplatform.container.xml.InitParams;
+import org.exoplatform.container.xml.ValueParam;
+import org.exoplatform.portal.resource.compressor.BaseResourceCompressorPlugin;
+import org.exoplatform.portal.resource.compressor.ResourceCompressorException;
+import org.exoplatform.portal.resource.compressor.ResourceType;
+
+/**
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public class JSMinCompressorPlugin extends BaseResourceCompressorPlugin
+{
+
+ private int priority;
+
+ public JSMinCompressorPlugin(InitParams params) throws Exception
+ {
+ ValueParam priorityParam = params.getValueParam("plugin.priority");
+ try
+ {
+ this.priority = Integer.parseInt(priorityParam.getValue());
+ }
+ catch (NumberFormatException NBFEx)
+ {
+ this.priority = -1;
+ }
+ }
+
+ @Override
+ public String getName()
+ {
+ return "JSMinCompressorPlugin";
+ }
+
+ public int getPriority()
+ {
+ return priority;
+ }
+
+ @Override
+ public ResourceType getResourceType()
+ {
+ return ResourceType.JAVASCRIPT;
+ }
+
+ @Override
+ public void compress(Reader input, Writer output) throws ResourceCompressorException,
IOException
+ {
+ super.compress(input, output);
+ }
+}
Added:
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/ResourceCompressorService.java
===================================================================
---
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/ResourceCompressorService.java
(rev 0)
+++
portal/branches/branched-r3845/component/web/resources/src/main/java/org/exoplatform/portal/resource/compressor/impl/ResourceCompressorService.java 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.portal.resource.compressor.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.exoplatform.container.component.ComponentPlugin;
+import org.exoplatform.container.xml.InitParams;
+import org.exoplatform.portal.resource.compressor.ResourceCompressor;
+import org.exoplatform.portal.resource.compressor.ResourceCompressorException;
+import org.exoplatform.portal.resource.compressor.ResourceCompressorPlugin;
+import org.exoplatform.portal.resource.compressor.ResourceType;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+/**
+ * @author <a href="mailto:hoang281283@gmail.com">Minh Hoang
TO</a>
+ * Aug 19, 2010
+ */
+
+public class ResourceCompressorService implements ResourceCompressor
+{
+
+ private Log log = ExoLogger.getLogger(ResourceCompressorService.class);
+
+ private Map<ResourceType, List<ResourceCompressorPlugin>> plugins;
+
+ private Map<ResourceType, String> defaultType_Key_Mapping;
+
+ public ResourceCompressorService(InitParams params) throws Exception
+ {
+
+ plugins = new HashMap<ResourceType, List<ResourceCompressorPlugin>>();
+ }
+
+ public void loadCompressorPlugin(ComponentPlugin plugin)
+ {
+ if(plugin != null && plugin instanceof ResourceCompressorPlugin)
+ {
+ registerCompressorPlugin((ResourceCompressorPlugin)plugin);
+ }
+ }
+
+ private void registerCompressorPlugin(ResourceCompressorPlugin plugin)
+ {
+ ResourceType type = plugin.getResourceType();
+ List<ResourceCompressorPlugin> sameResourceTypePlugins = plugins.get(type);
+
+ if(sameResourceTypePlugins != null)
+ {
+ sameResourceTypePlugins.add(plugin);
+ log.debug("Loaded compressor plugin: " + plugin.getName() + " for
resource type " + type.toString());
+ }
+ else{
+ List<ResourceCompressorPlugin> newListOfPlugins = new
ArrayList<ResourceCompressorPlugin>();
+ newListOfPlugins.add(plugin);
+ log.debug("Loaded compressor plugin: " + plugin.getName() + " for
new resource type " + type.toString());
+ plugins.put(type, newListOfPlugins);
+ }
+ }
+
+ public void unloadCompressorPlugin(ComponentPlugin plugin)
+ {
+
+ }
+
+
+ @Override
+ final public void compress(Reader input, Writer output, ResourceType resourceType)
throws ResourceCompressorException,
+ IOException
+ {
+ ResourceCompressorPlugin plugin =
getHighestPriorityCompressorPlugin(resourceType);
+ if(plugin != null)
+ {
+ plugin.compress(input, output);
+ }
+
+ //ResourceCompressorPlugin defaultPlugin =
getDefaultCompressorPlugin(resourceType);
+ //if(defaultPlugin != null)
+ //{
+ // defaultPlugin.compress(input, output);
+ //}
+ }
+
+ private ResourceCompressorPlugin getHighestPriorityCompressorPlugin(ResourceType
resourceType)
+ {
+ List<ResourceCompressorPlugin> candidates = plugins.get(resourceType);
+ if(candidates == null || candidates.size() == 0)
+ {
+ return null;
+ }
+
+ //Loop the list instead of invoking sort method
+ int highestPriorityIndex = 0;
+ int maxPriority = -1;
+
+ for(int i = 0; i < candidates.size(); i++)
+ {
+ int currentPriority = candidates.get(i).getPriority();
+ if(currentPriority > maxPriority)
+ {
+ highestPriorityIndex = i;
+ maxPriority = currentPriority;
+ }
+ }
+
+ return candidates.get(highestPriorityIndex);
+ }
+
+ private ResourceCompressorPlugin getDefaultCompressorPlugin(ResourceType
resourceType)
+ {
+ String key = this.defaultType_Key_Mapping.get(resourceType);
+ return getDefaultCompressorPlugin(resourceType, key);
+ }
+
+ private ResourceCompressorPlugin getDefaultCompressorPlugin(ResourceType resourceType,
String key)
+ {
+ List<ResourceCompressorPlugin> candidates = plugins.get(resourceType);
+ if(candidates == null)
+ {
+ return null;
+ }
+
+ for(ResourceCompressorPlugin plugin : candidates)
+ {
+ if(plugin.getName().equals(key))
+ {
+ return plugin;
+ }
+ }
+
+ if (candidates.size() > 0)
+ {
+ return candidates.get(0);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+}
Added:
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/common/compressor-configuration.xml
===================================================================
---
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/common/compressor-configuration.xml
(rev 0)
+++
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/common/compressor-configuration.xml 2010-08-20
07:46:53 UTC (rev 3877)
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+
+ Copyright (C) 2009 eXo Platform SAS.
+
+ This is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of
+ the License, or (at your option) any later version.
+
+ This software is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this software; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+
+-->
+
+<configuration
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://www.exoplaform.org/xml/ns/kernel_1_1.xsd
http://www.exoplaform.org/xml/ns/kernel_1_1.xsd"
+
xmlns="http://www.exoplaform.org/xml/ns/kernel_1_1.xsd">
+
+
+ <component>
+ <key>org.exoplatform.portal.resource.compressor.ResourceCompressor</key>
+
<type>org.exoplatform.portal.resource.compressor.impl.ResourceCompressorService</type>
+ <component-plugins>
+ <component-plugin>
+ <name>JSMinCompressorPlugin</name>
+ <set-method>loadCompressorPlugin</set-method>
+
<type>org.exoplatform.portal.resource.compressor.impl.JSMinCompressorPlugin</type>
+ <description>Javascript Compressor Plugin leveraging
JSMin</description>
+ <init-params>
+ <value-param>
+ <name>plugin.priority</name>
+ <value>1</value>
+ </value-param>
+ </init-params>
+ </component-plugin>
+ </component-plugins>
+ <init-params>
+ <value-param>
+ <name>JAVASCRIPT</name>
+ <value>JSMinCompressorPlugin</value>
+ </value-param>
+ <value-param>
+ <name>STYLESHEET</name>
+ <value>CSSMinCompressorPlugin</value>
+ </value-param>
+ </init-params>
+
+ </component>
+
+
+</configuration>
Modified:
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/configuration.xml
===================================================================
---
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/configuration.xml 2010-08-19
17:57:41 UTC (rev 3876)
+++
portal/branches/branched-r3845/web/portal/src/main/webapp/WEB-INF/conf/configuration.xml 2010-08-20
07:46:53 UTC (rev 3877)
@@ -25,6 +25,7 @@
xsi:schemaLocation="http://www.exoplaform.org/xml/ns/kernel_1_1.xsd
http://www.exoplaform.org/xml/ns/kernel_1_1.xsd"
xmlns="http://www.exoplaform.org/xml/ns/kernel_1_1.xsd">
<import>war:/conf/common/common-configuration.xml</import>
+ <import>war:/conf/common/compressor-configuration.xml</import>
<import>war:/conf/common/portlet-container-configuration.xml</import>
<import
profiles="jboss">war:/conf/wsrp/wsrp-configuration.xml</import>
<import>war:/conf/common/logs-configuration.xml</import>