/*******************************************************************************
* Copyright (c) 2011, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.orion.internal.server.hosting;
import org.eclipse.orion.server.core.ProtocolConstants;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.orion.server.core.OrionConfiguration;
import org.eclipse.orion.server.core.metastore.UserInfo;
import org.eclipse.orion.server.core.resources.Base64Counter;
import org.json.*;
/**
* Configuration details for a site that can be hosted on an Orion server.
*/
public class SiteInfo {
private String hostHint;
private String id;
private JSONArray mappings = new JSONArray();
private String name;
private String workspaceId;
/**
* Returns the object containing the current site configurations for this user.
*/
public static JSONObject getSites(UserInfo user) {
//return value is a JSONObject where key is site id, value is site object
String sites = user.getProperty(SiteConfigurationConstants.KEY_SITE_CONFIGURATIONS);
if (sites != null) {
try {
return new JSONObject(sites);
} catch (JSONException e) {
//let it fail on write
}
}
//assume there are no sites and create a new one
return new JSONObject();
}
public static SiteInfo getSite(UserInfo user, String siteId) {
JSONObject sites = getSites(user);
JSONObject siteObject;
try {
siteObject = sites.getJSONObject(siteId);
} catch (JSONException e) {
//does not exist
return null;
}
return new SiteInfo(siteObject);
}
/**
* Returns a new site configuration for the given user.
*/
public static SiteInfo newSiteConfiguration(UserInfo user, String name, String workspaceId) {
SiteInfo site = new SiteInfo();
site.setName(name);
site.setWorkspace(workspaceId);
site.setId(nextSiteId(user));
return site;
}
/**
* Returns a new site id that is unique for the given user.
*/
private static String nextSiteId(UserInfo user) {
Base64Counter counter = new Base64Counter();
String userName = user.getUserName();
JSONObject sitesObject = getSites(user);
String candidate = userName + '-' + counter.toString();
while (sitesObject.has(candidate)) {
counter.increment();
candidate = userName + '-' + counter.toString();
}
return candidate;
}
private SiteInfo() {
super();
}
/**
* Creates a new SiteInfo instance with information from the given input object.
*/
public SiteInfo(JSONObject siteObject) {
super();
this.id = siteObject.optString(ProtocolConstants.KEY_ID);
this.name = siteObject.optString(ProtocolConstants.KEY_NAME);
this.hostHint = siteObject.optString(SiteConfigurationConstants.KEY_HOST_HINT);
this.workspaceId = siteObject.optString(SiteConfigurationConstants.KEY_WORKSPACE);
this.mappings = siteObject.optJSONArray(SiteConfigurationConstants.KEY_MAPPINGS);
}
public String getHostHint() {
return hostHint;
}
/**
* @return the id
*/
public String getId() {
return id;
}
public JSONArray getMappingsJSON() {
return mappings;
}
/**
* @return the name
*/
public String getName() {
return name;
}
public String getWorkspace() {
return workspaceId;
}
/**
* Saves this site configuration in the given user info.
* @param user
* @throws CoreException
*/
public void save(UserInfo user) throws CoreException {
JSONObject sites = getSites(user);
try {
sites.put(getId(), toJSON());
} catch (JSONException e) {
//should never happen if metadata is well formed
throw new RuntimeException(e);
}
user.setProperty(SiteConfigurationConstants.KEY_SITE_CONFIGURATIONS, sites.toString());
OrionConfiguration.getMetaStore().updateUser(user);
}
/**
* Removes this site from the given user.
* @throws CoreException
*/
public void delete(UserInfo user) throws CoreException {
JSONObject sites = getSites(user);
if (!sites.has(getId())) {
//nothing to do, site does not exist
return;
}
sites.remove(getId());
user.setProperty(SiteConfigurationConstants.KEY_SITE_CONFIGURATIONS, sites.toString());
OrionConfiguration.getMetaStore().updateUser(user);
}
public void setHostHint(String hint) {
this.hostHint = hint;
}
/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}
public void setMappings(JSONArray newMappings) {
this.mappings = newMappings == null ? new JSONArray() : newMappings;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
public void setWorkspace(String workspace) {
this.workspaceId = workspace;
}
/**
* Returns a JSON representation of this site configuration.
*/
public JSONObject toJSON() {
JSONObject result = new JSONObject();
try {
result.put(ProtocolConstants.KEY_ID, id);
result.put(ProtocolConstants.KEY_NAME, name);
result.put(SiteConfigurationConstants.KEY_HOST_HINT, hostHint);
result.put(SiteConfigurationConstants.KEY_WORKSPACE, workspaceId);
result.put(SiteConfigurationConstants.KEY_MAPPINGS, mappings);
} catch (JSONException e) {
//cannot happen because keys are well formed
throw new RuntimeException(e);
}
return result;
}
}