All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sakaiproject.entitybroker.util.devhelper.AbstractDeveloperHelperService Maven / Gradle / Ivy

/**
 * $Id$
 * $URL$
 * DeveloperHelperServiceImpl.java - entity-broker - Apr 13, 2008 6:30:08 PM - azeckoski
 **************************************************************************
 * Copyright (c) 2008, 2009 The Sakai Foundation
 *
 * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.entitybroker.util.devhelper;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.azeckoski.reflectutils.ReflectUtils;
import org.azeckoski.reflectutils.transcoders.HTMLTranscoder;
import org.azeckoski.reflectutils.transcoders.JSONTranscoder;
import org.azeckoski.reflectutils.transcoders.Transcoder;
import org.azeckoski.reflectutils.transcoders.XMLTranscoder;
import org.sakaiproject.entitybroker.DeveloperHelperService;
import org.sakaiproject.entitybroker.EntityBroker;
import org.sakaiproject.entitybroker.EntityBrokerManager;
import org.sakaiproject.entitybroker.EntityReference;
import org.sakaiproject.entitybroker.entityprovider.extension.Formats;
import org.sakaiproject.entitybroker.entityprovider.extension.RequestStorage;
import org.sakaiproject.entitybroker.providers.EntityPropertiesService;
import org.sakaiproject.entitybroker.providers.EntityRESTProvider;

import lombok.extern.slf4j.Slf4j;

/**
 * implementation of the helper service methods which are internal only
 * NOTE: you should probably override encode and decode data rather than simply using the current impl
 * 
 * @author Aaron Zeckoski ([email protected])
 */
@Slf4j
public abstract class AbstractDeveloperHelperService implements DeveloperHelperService {

    /**
     * EMPTY - do not use
     */
    public AbstractDeveloperHelperService() { super(); }

    /**
     * MINIMAL
     * @param entityBroker the main EntityBroker service
     * @param entityBrokerManager the main EB manager service
     */
    public AbstractDeveloperHelperService(EntityBroker entityBroker,
            EntityBrokerManager entityBrokerManager) {
        super();
        this.entityBroker = entityBroker;
        this.entityBrokerManager = entityBrokerManager;
        this.requestStorage = entityBrokerManager.getRequestStorage();
        this.entityProperties = entityBrokerManager.getEntityPropertiesService();
    }

    // weak ref to ensure we do not hold anything open
    protected WeakReference entityRESTProviderWeak;
    public EntityRESTProvider getEntityRESTProvider() {
        EntityRESTProvider erp = null;
        if (this.entityRESTProviderWeak == null) {
            setEntityRESTProvider( this.entityBrokerManager.getEntityRESTProvider() );
        }
        return erp;
    }
    /**
     * Set this to include an optional encoding/decoding handler
     * @param entityRESTProvider the encoding manager service
     */
    public void setEntityRESTProvider(EntityRESTProvider entityRESTProvider) {
        if (entityRESTProvider != null) {
            this.entityRESTProviderWeak = new WeakReference(entityRESTProvider);
        } else {
            this.entityRESTProviderWeak = null;
        }
    }

    // ENCODING / DECODING

    public Map decodeData(String data, String format) {
        if (format == null) {
            format = Formats.XML;
        }
        Map decoded = new HashMap(0);
        if (getEntityRESTProvider() == null) {
            log.warn("No entityRESTProvider available for decoding, using basic internal decoder");
            if (data != null) {
                Transcoder transcoder = getTranscoder(format);
                try {
                    decoded = transcoder.decode(data);
                } catch (RuntimeException e) {
                    // convert failure to UOE
                    throw new UnsupportedOperationException("Failure encoding data ("+data+") of type ("+data.getClass()+"): " + e.getMessage(), e);
                }
            }
        } else {
            decoded = getEntityRESTProvider().decodeData(data, format);
        }
        return decoded;
    }

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#encodeData(java.lang.Object, java.lang.String, java.lang.String, java.util.Map)
     */
    public String encodeData(Object data, String format, String name, Map properties) {
        if (format == null) {
            format = Formats.XML;
        }
        String encoded = "";
        if (getEntityRESTProvider() == null) {
            log.warn("No entityRESTProvider available for encoding, using basic internal encoder");
            if (data != null) {
                Transcoder transcoder = getTranscoder(format);
                try {
                    encoded = transcoder.encode(data, name, properties);
                } catch (RuntimeException e) {
                    // convert failure to UOE
                    throw new UnsupportedOperationException("Failure encoding data ("+data+") of type ("+data.getClass()+"): " + e.getMessage(), e);
                }
            }
        } else {
            encoded = getEntityRESTProvider().encodeData(data, format, name, properties);
        }
        return encoded;
    }

    /**
     * Encoding method to use when URL encoding
     */
    public static String URL_ENCODING = "UTF-8";
    /**
     * The site reference base
     */
    public static String GROUP_BASE = "/site/";
    /**
     * The user reference base
     */
    public static String USER_BASE = "/user/";

    protected final String CURRENT_USER_MARKER = "originalCurrentUser";

    // INTERNAL
    public EntityBroker entityBroker;
    public void setEntityBroker(EntityBroker entityBroker) {
        this.entityBroker = entityBroker;
    }

    public EntityBrokerManager entityBrokerManager;
    public void setEntityBrokerManager(EntityBrokerManager entityBrokerManager) {
        this.entityBrokerManager = entityBrokerManager;
    }

    public RequestStorage requestStorage;
    public void setRequestStorage(RequestStorage requestStorage) {
        this.requestStorage = requestStorage;
    }

    public EntityPropertiesService entityProperties;
    /**
     * Set this to include an optional properties handler
     * @param entityProperties
     */
    public void setEntityProperties(EntityPropertiesService entityProperties) {
        this.entityProperties = entityProperties;
    }


    // ENTITY

    public boolean entityExists(String reference) {
        return entityBroker.entityExists(reference);
    }

    public Object fetchEntity(String reference) {
        Object entity = entityBroker.fetchEntity(reference);
        return entity;
    }

    public void fireEvent(String eventName, String reference) {
        entityBroker.fireEvent(eventName, reference);
    }

    public String getEntityURL(String reference, String viewKey, String extension) {
        return entityBrokerManager.getEntityURL(reference, viewKey, extension);
    }


    // CONFIG

    // USER

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#getCurrentLocale()
     */
    public Locale getCurrentLocale() {
        return Locale.getDefault();
    }

    public String getUserIdFromRef(String userReference) {
        String userId = null;
        if (userReference != null) {
            if (userReference.startsWith("/")) {
                // assume the form of "/user/userId" (the UDS method is protected)
                userId = new EntityReference(userReference).getId();
            } else {
                // otherwise assume this is the id
                userId = userReference;
            }
        }
        return userId;
    }

    public String getUserRefFromUserId(String userId) {
        String userRef = null;
        if (userId != null) {
            // use the UDS method for controlling its references
            userRef = USER_BASE + userId;
        }
        return userRef;
    }

    public String getCurrentUserReference() {
        String userRef = null;
        String userId = getCurrentUserId();
        if (userId != null) {
            userRef = USER_BASE + userId;
        }
        return userRef;
    }

    // LOCATION

    public String getLocationIdFromRef(String locationReference) {
        String locationId = null;
        if (locationReference != null) {
            // assume the form of "/site/siteId" (the Site method is protected)
            locationId = new EntityReference(locationReference).getId();
        }
        return locationId;
    }

    public String getCurrentLocationReference() {
        String locRef = null;
        String locId = getCurrentLocationId();
        if (locId != null) {
            locRef = GROUP_BASE + locId;
        }
        return locRef;
    }

    public String getStartingLocationReference() {
        return "/";
    }

    public String getUserHomeLocationReference(String userReference) {
        if (userReference == null) {
            userReference = getCurrentUserReference();
        }
        String userId = getUserIdFromRef(userReference);
        String locationRef = null;
        if (userId != null) {
            locationRef = GROUP_BASE + "~" + userId; // make this manually
        } else {
            log.warn("Cannot get the userhome locationReference because there is no current user: " + userReference);
        }
        return locationRef;
    }

    // TOOLS

    public String getToolIdFromToolRef(String toolReference) {
        String toolId = null;
        if (toolReference != null) {
            toolId = new EntityReference(toolReference).getId();
        }
        return toolId;
    }

    // URLS

    public String getUserHomeLocationURL(String userReference) {
        String locationReference = getUserHomeLocationReference(userReference);
        if (locationReference == null) {
            throw new IllegalArgumentException("Could not get location from userReference ("+userReference+") to generate URL");
        }
        return getLocationReferenceURL(locationReference);
    }

    public String getLocationReferenceURL(String locationReference) {
        new EntityReference(locationReference); // validate the reference
        return getPortalURL() + locationReference;
    }

    // PERMISSIONS

    /**
     * Checks to see if a request is internal and therefore can bypass some or all security
     * @param reference an entity reference string
     * @return true if internal OR false if external or REST
     */
    public boolean isEntityRequestInternal(String reference) {
        boolean internal = false;
        String origin = (String) requestStorage.getStoredValue(RequestStorage.ReservedKeys._requestOrigin.name());
        if (RequestStorage.RequestOrigin.INTERNAL.name().equals(origin)) {
            internal = true;
        } else {
            if (reference != null) {
                String ref = (String) requestStorage.getStoredValue(RequestStorage.ReservedKeys._requestEntityReference.name());
                if (reference.equals(ref)) {
                    // if this ref was the one requested from outside it is definitely not internal
                    internal = false;
                } else {
                    internal = true;
                }
            }
        }
        return internal;
    }

    // BEANS

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#cloneBean(java.lang.Object, int, java.lang.String[])
     */
    public  T cloneBean(T bean, int maxDepth, String[] propertiesToSkip) {
        return ReflectUtils.getInstance().clone(bean, maxDepth, propertiesToSkip);
    }

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#copyBean(java.lang.Object, java.lang.Object, int, java.lang.String[], boolean)
     */
    public void copyBean(Object orig, Object dest, int maxDepth, String[] fieldNamesToSkip,
            boolean ignoreNulls) {
        ReflectUtils.getInstance().copy(orig, dest, maxDepth, fieldNamesToSkip, ignoreNulls);
    }

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#populate(java.lang.Object, java.util.Map)
     */
    public List populate(Object object, Map properties) {
        return ReflectUtils.getInstance().populate(object, properties);
    }

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#convert(java.lang.Object, java.lang.Class)
     */
    public  T convert(Object object, Class type) {
        return ReflectUtils.getInstance().convert(object, type);
    }


    private Map transcoders;
    private Transcoder getTranscoder(String format) {
        if (transcoders == null) {
            transcoders = new HashMap();
            JSONTranscoder jt = new JSONTranscoder(true, true, false);
            transcoders.put(jt.getHandledFormat(), jt);
            XMLTranscoder xt = new XMLTranscoder(true, true, false, false);
            transcoders.put(xt.getHandledFormat(), xt);
            HTMLTranscoder ht = new HTMLTranscoder();
            transcoders.put(ht.getHandledFormat(), ht);
        }
        Transcoder transcoder = transcoders.get(format);
        if (transcoder == null) {
            throw new IllegalArgumentException("Failed to find a transcoder for format, none exists, cannot encode or decode data for format: " + format);
        }
        return transcoder;
    }

    /* (non-Javadoc)
     * @see org.sakaiproject.entitybroker.DeveloperHelperService#getMessage(java.lang.String, java.lang.String)
     */
    public String getMessage(String prefix, String messageKey) {
        if (entityProperties == null) {
            throw new IllegalStateException("No entityPropertiesHandler available for retrieving properties strings");
        }
        return entityProperties.getProperty(prefix, messageKey);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy