/* * 2012-3 Red Hat Inc. and/or its affiliates and other contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.overlord.gadgets.web.server; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.shindig.auth.AnonymousSecurityToken; import org.apache.shindig.gadgets.servlet.GadgetsHandler; import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.BaseResponse; import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.EnumValuePair; import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.Error; import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.MetadataResponse; import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.ModulePrefs; import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.UserPref; import org.apache.shindig.protocol.BaseRequestItem; import org.apache.shindig.protocol.conversion.BeanConverter; import org.apache.shindig.protocol.conversion.BeanJsonConverter; import org.apache.shindig.protocol.multipart.FormDataItem; import org.json.JSONException; import org.json.JSONObject; import org.overlord.gadgets.server.model.Gadget; import org.overlord.gadgets.web.shared.dto.UserPreference; import org.overlord.gadgets.web.shared.dto.WidgetModel; import com.google.inject.Inject; import com.google.inject.name.Named; /** * @author: Jeff Yu * @date: 9/02/12 */ public class ShindigGadgetMetadataService implements GadgetMetadataService { public static final String USER_PREFS = "userPrefs"; public static final String DATA_TYPE = "dataType"; @Inject private GadgetsHandler gadgetsHandler; @Inject @Named("shindig.bean.converter.json") protected BeanConverter jsonConverter; /** * Constructor. */ public ShindigGadgetMetadataService() { } /** * @see org.overlord.gadgets.web.server.GadgetMetadataService#getGadgetMetadata(java.lang.String) */ @Override public WidgetModel getGadgetMetadata(String gadgetUrl) { try { MetadataResponse metaDataFromShindig = getMetaDataFromShindig(gadgetUrl); WidgetModel model = new WidgetModel(); model.setIframeUrl("http:" + metaDataFromShindig.getIframeUrl()); model.setName(metaDataFromShindig.getModulePrefs().getTitle()); model.setSpecUrl(gadgetUrl); // check to see if this gadget has at least one non-hidden user pref // to determine if we should display the edit prefs button boolean hasPrefsToEdit = false; if (metaDataFromShindig.getUserPrefs() != null && metaDataFromShindig.getUserPrefs().size() > 0) { UserPreference userPref = new UserPreference(); Map<String, UserPref> userPrefs = metaDataFromShindig.getUserPrefs(); Iterator<String> keys = userPrefs.keySet().iterator(); while (keys.hasNext()) { String settingName = keys.next(); UserPreference.UserPreferenceSetting theSetting = new UserPreference.UserPreferenceSetting(); UserPref setting = userPrefs.get(settingName); String theType = String.valueOf(setting.getDataType()); if (!UserPreference.Type.HIDDEN.toString().equals(theType)) { hasPrefsToEdit = true; } theSetting.setName(setting.getName()); theSetting.setDefaultValue(setting.getDefaultValue()); theSetting.setDisplayName(setting.getDisplayName()); theSetting.setRequired(setting.getRequired()); theSetting.setType(UserPreference.Type.valueOf(theType)); List<EnumValuePair> enumValues = setting.getOrderedEnumValues(); if (enumValues != null && enumValues.size() > 0) { for (EnumValuePair enumValuePair : enumValues) { UserPreference.Option option = new UserPreference.Option(); option.setValue(enumValuePair.getValue()); option.setDisplayValue(enumValuePair.getDisplayValue()); theSetting.addEnumOption(option); } } userPref.addUserPreferenceSetting(theSetting); } userPref.setNeedToEdit(hasPrefsToEdit); model.setUserPreference(userPref); } return model; } catch (JSONException e) { throw new IllegalArgumentException( "Error occurred while processing response from shindig metadata call", e); } } /** * @see org.overlord.gadgets.web.server.GadgetMetadataService#getGadgetData(java.lang.String) */ @Override public Gadget getGadgetData(String gadgetUrl) { try { MetadataResponse metaDataFromShindig = getMetaDataFromShindig(gadgetUrl); ModulePrefs modulePref = metaDataFromShindig.getModulePrefs(); Gadget gadget = new Gadget(); gadget.setTitle(modulePref.getTitle()); if (modulePref.getScreenshot() != null) gadget.setScreenshotUrl(String.valueOf(modulePref.getScreenshot())); gadget.setAuthorEmail(modulePref.getAuthorEmail()); gadget.setAuthor(modulePref.getAuthor()); if (modulePref.getTitleUrl() != null) gadget.setTitleUrl(modulePref.getTitleUrl().toString()); if (modulePref.getThumbnail() != null) gadget.setThumbnailUrl(modulePref.getThumbnail().toString()); gadget.setDescription(modulePref.getDescription()); return gadget; } catch (JSONException e) { throw new IllegalArgumentException( "Error occurred while processing response from shindig metadata call", e); } } /** * Gets the gadget meta-data as a JSON object (from the shindig meta-data service). * @param gadgetUrl * @throws JSONException */ private MetadataResponse getMetaDataFromShindig(String gadgetUrl) throws JSONException { JSONObject params = new JSONObject() .put("container", "default") .put("view", "home") .put("st", "default") .put("debug", true) .append("ids", gadgetUrl) .append("fields", "iframeUrl") .append("fields", "modulePrefs.*") .append("fields", "needsTokenRefresh") .append("fields", "userPrefs.*") .append("fields", "views.preferredHeight") .append("fields", "views.preferredWidth") .append("fields", "expireTimeMs") .append("fields", "responseTimeMs") .put("userId", "@viewer") .put("groupId", "@self"); AnonymousSecurityToken securityToken = new AnonymousSecurityToken(); BaseRequestItem request = new BaseRequestItem(params, new HashMap<String, FormDataItem>(), securityToken, this.jsonConverter, (BeanJsonConverter) this.jsonConverter); Map<String, BaseResponse> responses = this.gadgetsHandler.metadata(request); BaseResponse response = responses.get(gadgetUrl); if (response instanceof MetadataResponse) { return (MetadataResponse) response; } else { Error error = response.getError(); if (error != null) { throw new JSONException(error.getMessage()); } else { throw new JSONException("Unknown error:" + response.getUrl()); } } } }