FriendlyServiceImpl.java
package org.exoplatform.services.wcm.friendly.impl;
/*
* Copyright (C) 2003-2009 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
import java.util.LinkedHashMap;
import java.util.Map;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.container.xml.ObjectParameter;
import org.exoplatform.container.xml.ValueParam;
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.annotations.ManagedName;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.Property;
import org.exoplatform.management.rest.annotations.RESTEndpoint;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.friendly.FriendlyService;
import org.exoplatform.services.wcm.friendly.impl.FriendlyConfig.Friendly;
@Managed
@NameTemplate({@Property(key = "view", value = "portal"), @Property(key = "service", value = "friendly"),
@Property(key = "type", value = "content")})
@ManagedDescription("Friendly service")
@RESTEndpoint(path = "friendlyservice")
public class FriendlyServiceImpl implements FriendlyService {
private String servletName = "content";
private boolean isEnabled = false;
private Map<String, String> friendlies;
private Map<String, String> unfriendlies;
private static final Log LOG = ExoLogger.getLogger(FriendlyServiceImpl.class.getName());
public FriendlyServiceImpl(InitParams initParams) {
friendlies = new LinkedHashMap<String, String>(5);
unfriendlies = new LinkedHashMap<String, String>(5);
if (initParams!=null) init(initParams);
}
private void init(InitParams initParams) {
ValueParam enabled = initParams.getValueParam("enabled");
ValueParam servletName = initParams.getValueParam("servletName");
if (enabled!=null) {
if ("true".equals(enabled.getValue())) {
isEnabled = true;
}
}
if (LOG.isInfoEnabled()) LOG.info("isEnabled:"+isEnabled);
if (servletName!=null) {
this.servletName = servletName.getValue();
}
if (LOG.isInfoEnabled()) LOG.info("servletName:"+this.servletName);
ObjectParameter objectParam = initParams.getObjectParam("friendlies.configuration");
if (objectParam != null) {
FriendlyConfig config = (FriendlyConfig)objectParam.getObject();
for (Friendly friendly:config.getFriendlies()) {
this.addFriendly(friendly.getFriendlyUri(), friendly.getUnfriendlyUri());
}
}
}
public void addConfiguration(FriendlyPlugin plugin) {
this.init(plugin.getInitParams());
}
@Managed
@ManagedDescription("Is the service enabled ?")
public boolean isEnabled() {
return isEnabled;
}
@Managed
@ManagedDescription("Is the service enabled ?")
public void setEnabled(@ManagedDescription("Enable/Disable this service ?") @ManagedName("isEnabled") boolean isEnabled) {
this.isEnabled = isEnabled;
}
@Managed
@ManagedDescription("The servlet name referenced in this service")
public String getServletName() {
return servletName;
}
public void setServletName(String servletName) {
this.servletName = servletName;
}
@Managed
@ManagedDescription("Add a new friendly in the list")
public void addFriendly(@ManagedDescription("The friendly Uri") @ManagedName("friendlyUri") String friendlyUri,
@ManagedDescription("The unfriendly Uri") @ManagedName("unfriendlyUri") String unfriendlyUri) {
if (!friendlies.containsKey(friendlyUri)) {
if (LOG.isInfoEnabled()) LOG.info("addFriendly::"+friendlyUri+"::"+unfriendlyUri+ "::");
this.friendlies.put(friendlyUri, unfriendlyUri);
this.unfriendlies.put(unfriendlyUri, friendlyUri);
}
}
public String getFriendlyUri(String unfriendlyUri) {
if (!isEnabled) return unfriendlyUri;
for (String unf : unfriendlies.keySet()) {
if (unfriendlyUri.contains(unf)) {
String fr = unfriendlies.get(unf);
return unfriendlyUri.replace(unf, "/"+getServletName()+"/"+fr);
}
}
return unfriendlyUri;
}
public String getUnfriendlyUri(String friendlyUri) {
if (!isEnabled) return friendlyUri;
String friendly = "/"+getServletName()+"/";
if (friendlyUri.contains(friendly)) {
int start = friendlyUri.indexOf(friendly) + friendly.length();
int end = friendlyUri.substring(start).indexOf("/");
if (end > -1) {
String furi = friendlyUri.substring(start, start+end);
if (friendlies.containsKey(furi)) {
String unf = friendlies.get(furi);
return friendlyUri.replace(friendly + furi, unf);
}
}
}
return friendlyUri;
}
@Managed
@ManagedDescription("Remove a friendly in the list")
public void removeFriendly(@ManagedDescription("The friendly Uri") @ManagedName("friendlyUri") String friendlyUri) {
if (friendlies.containsKey(friendlyUri)) {
String unf = this.friendlies.get(friendlyUri);
friendlies.remove(friendlyUri);
unfriendlies.remove(unf);
}
}
@Managed
@ManagedDescription("The list of registered friendlies")
public Map<String, String> getFriendlies() {
return friendlies;
}
}