CompositeSkin(SkinService service, Collection<SkinConfig> skins) {
    TreeMap<String, SkinConfig> urlSkins = new TreeMap<String, SkinConfig>();
    for (SkinConfig skin : skins) {
      urlSkins.put(skin.getCSSPath(), skin);
    }

    //
    final StringBuilder builder = new StringBuilder();
    builder.append("/portal/resource");

    //
    final StringBuilder id = new StringBuilder();

    //
    try {
      for (SkinConfig cfg : urlSkins.values()) {
        StringBuilder encodedName = new StringBuilder();
        Codec.encode(encodedName, cfg.getName());
        StringBuilder encodedModule = new StringBuilder();
        Codec.encode(encodedModule, cfg.getModule());

        //
        id.append(encodedName).append(encodedModule);
        builder.append("/").append(encodedName).append("/").append(encodedModule);
      }
    } catch (IOException e) {
      throw new Error(e);
    }

    //
    this.service = service;
    this.id = id.toString();
    this.urlPrefix = builder.toString();
  }
  public void testDeployedSkinModules() {
    assertNotNull(skinService.getAvailableSkinNames());
    assertTrue(skinService.getAvailableSkinNames().contains("TestSkin"));

    Collection<SkinConfig> skinConfigs = skinService.getPortalSkins("TestSkin");
    assertNotNull(skinConfigs);

    SkinConfig portalSkin = null;
    for (SkinConfig config : skinConfigs) {
      if ("TestSkin".equals(config.getName())) {
        portalSkin = config;
        break;
      }
    }
    assertNotNull(portalSkin);
    assertEquals(
        mockServletContext.getContextPath() + "/skin/Stylesheet.css", portalSkin.getCSSPath());

    SkinConfig firstPortletSkin = skinService.getSkin("mockwebapp/FirstPortlet", "TestSkin");
    assertNotNull(firstPortletSkin);
    assertEquals(
        mockServletContext.getContextPath() + "/skin/portlet/FirstPortlet/Stylesheet.css",
        firstPortletSkin.getCSSPath());
  }