/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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.eurekastreams.web.client.jsni;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eurekastreams.server.domain.GeneralGadgetDefinition;
import org.eurekastreams.server.domain.gadgetspec.GadgetMetaDataDTO;
import org.eurekastreams.server.domain.gadgetspec.UserPrefDTO;
import org.eurekastreams.web.client.events.GotGadgetMetaDataEvent;
import org.eurekastreams.web.client.ui.Session;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.ui.FlowPanel;
/**
* Wrapper class for shindigs gadget meta data fetcher.
*
*/
public class GadgetMetaDataFetcher extends FlowPanel
{
/**
* Interface for the command that will be executed once we get the metadata.
*
*/
public interface GotGadgetMetaDataCommand
{
/**
* This method will be called after we get the metadata.
*
* @param metadata
* the metadata that we got from shindig.
*/
void onGotGadgetMetaData(final List<GadgetMetaDataDTO> metadata);
}
/**
* The command.
*/
private static GotGadgetMetaDataCommand onGotGadgetMetaData = null;
/**
* The gadget defs to look up.
*/
private static List<GeneralGadgetDefinition> gadgetDefs;
/**
* Default constructor.
*
* @param inGadgetDefs
* the gadget defs to look up.
*/
@SuppressWarnings("unchecked")
public GadgetMetaDataFetcher(final List inGadgetDefs)
{
gadgetDefs = inGadgetDefs;
}
/**
* Adds a command to be executed when we have the metadata.
*
* @param inCommand
* the command to execute.
*/
@Deprecated
public void addOnMetaDataRetrievedCommand(final GotGadgetMetaDataCommand inCommand)
{
onGotGadgetMetaData = inCommand;
}
/**
* Gets called from JSNI with the shindig results and wraps them into Java objects.
*
* @param metadata
* the shindig metadata.
*/
public static void gotGadgetMetaData(final JavaScriptObject metadata)
{
List<GadgetMetaDataDTO> gadgetMetaDataList = new LinkedList<GadgetMetaDataDTO>();
for (GeneralGadgetDefinition gadgetDef : gadgetDefs)
{
gadgetMetaDataList.add(new GadgetMetaDataDTO(gadgetDef));
}
for (int i = 0; i < getGadgetCount(metadata); i++)
{
if (isGadgetValid(metadata, i))
{
String url = getGadgetUrl(metadata, i);
int j = 0;
for (j = 0; j < gadgetDefs.size(); j++)
{
if (gadgetDefs.get(j).getUrl().equals(url))
{
break;
}
}
GadgetMetaDataDTO gMetaData = new GadgetMetaDataDTO(gadgetDefs.get(j));
gMetaData.setTitle(getGadgetTitle(metadata, i));
gMetaData.setTitleUrl(getGadgetTitleUrl(metadata, i));
gMetaData.setDescription(getGadgetDescription(metadata, i));
gMetaData.setAuthor(getGadgetAuthor(metadata, i));
gMetaData.setAuthorEmail(getGadgetAuthorEmail(metadata, i));
gMetaData.setThumbnail(getGadgetThumbnail(metadata, i));
gMetaData.setScreenshot(getGadgetScreenshot(metadata, i));
gMetaData.setString(getGadgetString(metadata, i));
List<UserPrefDTO> userPrefs = new ArrayList<UserPrefDTO>();
String[] keys = getUserPrefsKeys(metadata, i);
for (int k = 0; k < keys.length; k++)
{
UserPrefDTO userPref = new UserPrefDTO();
userPref.setDisplayName(getUserPrefDisplayName(metadata, i, keys[k]));
userPref.setDataType(getUserPrefType(metadata, i, keys[k]).toUpperCase());
userPrefs.add(userPref);
}
gMetaData.setUserPrefs(userPrefs);
List<String> features = new ArrayList<String>();
String[] featuresFromGadget = getFeatures(metadata, i);
for (int f = 0; f < featuresFromGadget.length; f++)
{
features.add(featuresFromGadget[f]);
}
gMetaData.setFeatures(features);
List<String> views = new ArrayList<String>();
String[] viewsFromGadget = getViewNames(metadata, i);
for (int f = 0; f < viewsFromGadget.length; f++)
{
views.add(viewsFromGadget[f]);
}
gMetaData.setViewNames(views);
gadgetMetaDataList.remove(j);
gadgetMetaDataList.add(j, gMetaData);
}
}
// DEPRECATED: Use event bus.
if (onGotGadgetMetaData != null)
{
onGotGadgetMetaData.onGotGadgetMetaData(gadgetMetaDataList);
}
Session.getInstance().getEventBus().notifyObservers(new GotGadgetMetaDataEvent(gadgetMetaDataList));
}
/**
* Gets called by clients to fetch metadata.
*/
public void fetchMetaData()
{
String[] urlArray = new String[gadgetDefs.size()];
for (int i = 0; i < gadgetDefs.size(); i++)
{
urlArray[i] = gadgetDefs.get(i).getUrl();
}
fetchMetaData(urlArray);
}
/**
* Gets the gadgets count from shindig.
*
* @param metadata
* the metadata object.
* @return the count.
*/
private static native int getGadgetCount(final JavaScriptObject metadata) /*-{
return metadata.gadgets.length;
}-*/;
/**
* Gets the user prefs count.
*
* @param metadata
* the metadata object.
* @param index
* the index.
* @return the user prefs count.
*/
private static native String[] getUserPrefsKeys(final JavaScriptObject metadata, final int index) /*-{
var arr = [];
for (var p in metadata.gadgets[index].userPrefs)
{
arr.push(p);
}
return arr;
}-*/;
/**
* Gets the gadget view names.
*
* @param metadata
* the metadata object.
* @param index
* the index.
* @return the gadget view names.
*/
private static native String[] getViewNames(final JavaScriptObject metadata, final int index) /*-{
var arr = [];
for (var p in metadata.gadgets[index].views)
{
arr.push(p);
}
return arr;
}-*/;
/**
* Gets the features.
*
* @param metadata
* the metadata object.
* @param index
* the index.
* @return the features.
*/
private static native String[] getFeatures(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].features;
}-*/;
/**
* Gets the user pref display name.
*
* @param metadata
* the metadata object.
* @param gadgetIndex
* the gadget index.
* @param prefIndex
* the user pref index.
* @return the user pref display name.
*/
private static native String getUserPrefDisplayName(final JavaScriptObject metadata, final int gadgetIndex,
final String prefIndex) /*-{
return metadata.gadgets[gadgetIndex].userPrefs[prefIndex].displayName;
}-*/;
/**
* Gets the user pref type.
*
* @param metadata
* the metadata object.
* @param gadgetIndex
* the gadget index.
* @param prefIndex
* the user pref index.
* @return the user pref type.
*/
private static native String getUserPrefType(final JavaScriptObject metadata, final int gadgetIndex,
final String prefIndex) /*-{
return metadata.gadgets[gadgetIndex].userPrefs[prefIndex].type;
}-*/;
/**
* Checks if the gadget is valid.
*
* @param metadata
* the metadata object.
* @param index
* the index.
* @return whether or not the gadget is valid.
*/
private static native boolean isGadgetValid(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].errors == null;
}-*/;
/**
* Gets the gadget title.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the title.
*/
private static native String getGadgetTitle(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].title;
}-*/;
/**
* Gets the gadget url.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the url.
*/
private static native String getGadgetTitleUrl(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].titleUrl;
}-*/;
/**
* Gets the gadget url.
*
* @param metadata
* the metadata.
* @param index
* hte index.
* @return the url.
*/
private static native String getGadgetUrl(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].url;
}-*/;
/**
* Gets the gadget desc.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the desc.
*/
private static native String getGadgetDescription(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].description;
}-*/;
/**
* Gets the gadget author.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the author.
*/
private static native String getGadgetAuthor(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].author;
}-*/;
/**
* Gets the gadget author email.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the authors email.
*/
private static native String getGadgetAuthorEmail(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].authorEmail;
}-*/;
/**
* Gets the gadget thumbnail.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the thumbnail.
*/
private static native String getGadgetThumbnail(final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].thumbnail;
}-*/;
/**
* Gets the gadget screenshot.
*
* @param metadata
* the metadata.
* @param index
* the index.
* @return the screenshot.
*/
private static native String getGadgetScreenshot(
final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].screenshot;
}-*/;
/**
* Gets the gadget string.
*
* @param metadata
* the metadata.
*
* @param index
* the index. *
* @return the string.
*/
private static native String getGadgetString(
final JavaScriptObject metadata, final int index) /*-{
return metadata.gadgets[index].string;
}-*/;
/**
* Fetches the metadata from shindig.
*
* @param url
* the urls to fetch for.
*/
private native void fetchMetaData(final String[] url) /*-{
var request = '{';
request += '"context": {';
request += '"country": "default",';
request += '"language": "default",';
request += '"view": "preview",';
request += '"container": "eureka"';
request += '},"gadgets": [';
for(var i=0;i<url.length;i++)
{
request += '{"url": "' + url[i] + '"}';
if(i!=url.length-1)
{
request += ",";
}
}
request += ']}';
var callback = function(m){
if (m != null )
{
@org.eurekastreams.web.client.jsni.GadgetMetaDataFetcher::gotGadgetMetaData(Lcom/google/gwt/core/client/JavaScriptObject;)(m);
}
};
$wnd.eurekastreams.util.sendRequestToServer("/gadgets/metadata",
"POST", request,
callback, true);
}-*/;
}