/*
* 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/>.
*/
package org.exoplatform.wcm.connector.collaboration;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import org.exoplatform.services.resources.ResourceBundleService;
import org.exoplatform.services.rest.resource.ResourceContainer;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Gets the bundle that is based on the key and the locale.
*
* @LevelAPI Provisional
*
* @anchor ResourceBundleConnector
*/
@Path("/bundle/")
public class ResourceBundleConnector implements ResourceContainer {
/**
* Gets the bundle that is based on the key and the locale.
*
* @param key The key used to get the bundle.
* @param locale The locale used to get the bundle.
*
* @anchor ResourceBundleConnector.getBundle
*/
@GET
@Path("/getBundle/")
public Response getBundle (
@QueryParam("key") String key,
@QueryParam("locale") String locale) {
try {
ResourceBundleService resourceBundleService = WCMCoreUtils.getService(ResourceBundleService.class);
String resourceBundleNames[] = resourceBundleService.getSharedResourceBundleNames();
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element bundles = document.createElement("bundles");
bundles.setAttribute("locale", locale);
String keys[] = key.split(",");
Set<String> remainingKeys = new LinkedHashSet<String>(keys.length + 1, 1f);
Collections.addAll(remainingKeys, keys);
loop : for (String resourceBundleName : resourceBundleNames) {
ResourceBundle resourceBundle = null;
if(locale.indexOf("_") > 0) {
resourceBundle = resourceBundleService.getResourceBundle(resourceBundleName, new Locale(
locale.substring(0, locale.lastIndexOf("_")),
locale.substring(locale.lastIndexOf("_") + 1, locale.length())));
} else {
resourceBundle = resourceBundleService.getResourceBundle(resourceBundleName, new Locale(locale));
}
for (Iterator<String> it = remainingKeys.iterator(); it.hasNext();) {
String oneKey = it.next();
try {
String value = resourceBundle.getString(oneKey);
Element element = document.createElement(oneKey);
element.setAttribute("value", value);
bundles.appendChild(element);
it.remove();
if (remainingKeys.isEmpty()) {
break loop;
}
} catch (MissingResourceException e) {
continue;
}
}
}
document.appendChild(bundles);
CacheControl cacheControl = new CacheControl();
cacheControl.setNoCache(true);
cacheControl.setNoStore(true);
return Response.ok(new DOMSource(document), MediaType.TEXT_XML).cacheControl(cacheControl).build();
} catch (Exception e) {
return Response.serverError().build();
}
}
}