/* * Copyright (C) 2011 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.mop.i18n; import java.util.Collection; import java.util.Collections; import java.util.Locale; import java.util.Map; import org.gatein.mop.api.workspace.WorkspaceObject; import org.gatein.mop.spi.AdapterLifeCycle; /** * An adapter that provides the i18n support for mop mixins, giving read/write access to default mixins and/or i18n mixins. * * @author <a href="mailto:khoi.nguyen@exoplatform.com">Nguyen Duc Khoi</a> * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class I18NAdapter { /** . */ private final WorkspaceObject obj; private I18NAdapter(WorkspaceObject obj) { this.obj = obj; } public <M> M getMixin(Class<M> mixinType, boolean create) throws NullPointerException { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (obj.isAdapted(mixinType) || create) { return obj.adapt(mixinType); } else { return null; } } public <M> void removeMixin(Class<M> mixinType) throws NullPointerException { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (obj.isAdapted(mixinType)) { obj.removeAdapter(mixinType); } } /** * Resolve the mixin for the specified locale. * * @param mixinType the expected mixin type * @param locale the locale * @param <M> the mixin generic type * @return the resolution or null if it cannot be resolved * @throws NullPointerException if any argument is null */ public <M> Resolution<M> resolveI18NMixin(Class<M> mixinType, Locale locale) throws NullPointerException { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (locale == null) { throw new NullPointerException("No null locale accepted"); } if (locale.getLanguage().length() > 0 && obj.isAdapted(I18Nized.class)) { I18Nized ized = obj.adapt(I18Nized.class); return ized.resolveMixin(mixinType, locale); } else { return null; } } public <M> M getI18NMixin(Class<M> mixinType, Locale locale, boolean create) throws NullPointerException, IllegalArgumentException { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (locale == null) { throw new NullPointerException("No null locale accepted"); } if (obj.isAdapted(I18Nized.class)) { I18Nized ized = obj.adapt(I18Nized.class); return ized.getMixin(mixinType, locale, create); } else if (create) { I18Nized ized = obj.adapt(I18Nized.class); return ized.getMixin(mixinType, locale, true); } else { return null; } } public <M> Map<Locale, M> getI18NMixin(Class<M> mixinType) throws NullPointerException { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (obj.isAdapted(I18Nized.class)) { I18Nized ized = obj.adapt(I18Nized.class); return ized.getMixins(mixinType); } else { return null; } } public <M> M addI18NMixin(Class<M> mixinType, Locale locale) throws NullPointerException, IllegalArgumentException { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (locale == null) { throw new NullPointerException("No null locale accepted"); } I18Nized ized; if (obj.isAdapted(I18Nized.class)) { ized = obj.adapt(I18Nized.class); } else { ized = obj.adapt(I18Nized.class); } return ized.getMixin(mixinType, locale, true); } public <M> Collection<Locale> removeI18NMixin(Class<M> mixinType) { if (mixinType == null) { throw new NullPointerException("No null mixin type accepted"); } if (obj.isAdapted(I18Nized.class)) { I18Nized ized = obj.adapt(I18Nized.class); return ized.removeMixin(mixinType); } else { return Collections.emptyList(); } } public static class LifeCycle extends AdapterLifeCycle<WorkspaceObject, I18NAdapter> { @Override public I18NAdapter create(WorkspaceObject adaptee, Class<I18NAdapter> adapterType) { return new I18NAdapter(adaptee); } @Override public void destroy(I18NAdapter adapter, WorkspaceObject adaptee, Class<I18NAdapter> adapterType) { } } }