Class App

  • All Implemented Interfaces:
    Linkable, ParaObject, Votable, Serializable

    public class App
    extends Object
    implements ParaObject, Serializable
    This is a representation of an application within Para.
    It allows the user to create separate apps running on the same infrastructure. Every ParaObject belongs to an app.
    Apps can have a dedicated table or they can share the same table using prefixed keys. Also, apps can have a dedicated search index or share one. These are controlled by the two flags isSharingTable() and isSharingIndex().
    Usually when we have a multi-app environment there's a parent app (dedicated) and lots of child apps (shared) that share the same index with the parent app.
    Author:
    Alex Bogdanovski [alex@erudika.com]
    See Also:
    Serialized Form
    • Constructor Detail

      • App

        public App()
        No-args constructor.
      • App

        public App​(String id)
        Default constructor.
        Parameters:
        id - the name of the app
    • Method Detail

      • id

        public static final String id​(String id)
        Returns the correct id of this app with prefix.
        Parameters:
        id - an id like "myapp"
        Returns:
        the full id, e.g. "app:myapp"
      • identifier

        public static final String identifier​(String appid)
        Returns the identifier without the "app:" prefix.
        Parameters:
        appid - app id
        Returns:
        just the name of the app
      • setId

        public final void setId​(String id)
        Description copied from interface: ParaObject
        Sets a new id. Must not be null or empty.
        Specified by:
        setId in interface ParaObject
        Parameters:
        id - the new id
      • addSetting

        public App addSetting​(String name,
                              Object value)
        Adds a new setting to the map.
        Parameters:
        name - a key
        value - a value
        Returns:
        this
      • addAllSettings

        public App addAllSettings​(Map<String,​Object> settings)
        Adds all settings to map of app settings and invokes all AppSettingAddedListeners.
        Parameters:
        settings - a map settings to add
        Returns:
        this
      • getSetting

        public Object getSetting​(String name)
        Returns the value of a setting for a given key.
        Parameters:
        name - the key
        Returns:
        the value
      • removeSetting

        public App removeSetting​(String name)
        Removes a setting from the map.
        Parameters:
        name - the key
        Returns:
        this
      • getSettings

        public Map<String,​Object> getSettings()
        A map of all settings (key/values).
        Returns:
        a map
      • setSettings

        public void setSettings​(Map<String,​Object> settings)
        Overwrites the settings map.
        Parameters:
        settings - a new map
      • getValidationConstraints

        public Map<String,​Map<String,​Map<String,​Map<String,​?>>>> getValidationConstraints()
        Returns a map of user-defined data types and their validation annotations.
        Returns:
        the constraints map
      • setValidationConstraints

        public void setValidationConstraints​(Map<String,​Map<String,​Map<String,​Map<String,​?>>>> validationConstraints)
        Sets the validation constraints map.
        Parameters:
        validationConstraints - the constraints map
      • getResourcePermissions

        public Map<String,​Map<String,​List<String>>> getResourcePermissions()
        Returns a map of resource permissions.
        Returns:
        the permissions map
      • setResourcePermissions

        public void setResourcePermissions​(Map<String,​Map<String,​List<String>>> resourcePermissions)
        Sets the permissions map.
        Parameters:
        resourcePermissions - permissions map
      • getAppIdentifier

        public String getAppIdentifier()
        The App identifier (the id but without the prefix app:). The identifier may start with a whitespace character e.g. " myapp". This indicates that the app is sharing a table with other apps. This is disabled by default unless para.prepend_shared_appids_with_space = true
        Returns:
        the identifier (appid)
      • getActive

        public Boolean getActive()
        Returns true if this application is active (enabled).
        Returns:
        true if active
      • setActive

        public void setActive​(Boolean active)
        Sets the active flag. When an app is disabled (active = false) it cannot be accessed through the API.
        Parameters:
        active - true if active
      • getDeleteOn

        public Long getDeleteOn()
        The timestamp for when this app must be deleted.
        Returns:
        a timestamp
      • setDeleteOn

        public void setDeleteOn​(Long deleteOn)
        Sets the time for deletion.
        Parameters:
        deleteOn - a timestamp
      • getTokenValiditySec

        public Long getTokenValiditySec()
        The validity period for access tokens in seconds. This setting is for current app only. Always returns a default value if local setting is null.
        Returns:
        period in seconds
      • setTokenValiditySec

        public void setTokenValiditySec​(Long tokenValiditySec)
        Sets the access token validity period in seconds.
        Parameters:
        tokenValiditySec - seconds
      • getSecret

        public String getSecret()
        Returns the app's secret key.
        Returns:
        the secret key
      • setSecret

        public void setSecret​(String secret)
        Sets the secret key.
        Parameters:
        secret - a secret key
      • getReadOnly

        public Boolean getReadOnly()
        Gets read-only mode.
        Returns:
        true if app is in read-only mode
      • setReadOnly

        public void setReadOnly​(Boolean readOnly)
        Sets read-only mode.
        Parameters:
        readOnly - true if app is in read-only mode
      • getDatatypes

        public Map<String,​String> getDatatypes()
        Returns a set of custom data types for this app. An app can have many custom types which describe its domain.
        Returns:
        a map of type names (plural form to singular)
      • setDatatypes

        public void setDatatypes​(Map<String,​String> datatypes)
        Sets the data types for this app.
        Parameters:
        datatypes - a map of type names (plural form to singular)
      • isSharingIndex

        public boolean isSharingIndex()
        Is this a sharing the search index with other apps.
        Returns:
        true if it does
      • setSharingIndex

        public void setSharingIndex​(boolean sharingIndex)
        Sets the sharingIndex flag.
        Parameters:
        sharingIndex - false means this app should have its own dedicated index
      • isSharingTable

        public boolean isSharingTable()
        Is this a sharing the database table with other apps.
        Returns:
        true if it does
      • setSharingTable

        public void setSharingTable​(boolean sharingTable)
        Sets the sharingTable flag.
        Parameters:
        sharingTable - false means this app should have its own dedicated table
      • isRootApp

        public boolean isRootApp()
        Return true if the app is the root app (the first one created).
        Returns:
        true if root
      • isRoot

        public static boolean isRoot​(String appid)
        Return true if the app is the root app (the first one created).
        Parameters:
        appid - an app identifier
        Returns:
        true if root
      • getAllValidationConstraints

        public Map<String,​Map<String,​Map<String,​Map<String,​?>>>> getAllValidationConstraints​(String... types)
        Returns all validation constraints for a list of types.
        Parameters:
        types - a list of valid Para data types
        Returns:
        a map of validation constraints for given types
      • addValidationConstraint

        public boolean addValidationConstraint​(String type,
                                               String field,
                                               Constraint c)
        Adds a new constraint to the list of constraints for a given field and type.
        Parameters:
        type - the type
        field - the field
        c - the constraint
        Returns:
        true if successful
      • removeValidationConstraint

        public boolean removeValidationConstraint​(String type,
                                                  String field,
                                                  String constraintName)
        Removes a constraint from the map.
        Parameters:
        type - the type
        field - the field
        constraintName - the constraint name
        Returns:
        true if successful
      • getAllResourcePermissions

        public Map<String,​Map<String,​List<String>>> getAllResourcePermissions​(String... subjectids)
        Returns all resource permission for a list of subjects ids.
        Parameters:
        subjectids - subject ids (user ids)
        Returns:
        a map of all resource permissions per subject
      • grantResourcePermission

        public boolean grantResourcePermission​(String subjectid,
                                               String resourcePath,
                                               EnumSet<App.AllowedMethods> permission)
        Grants a new permission for a given subject and resource.
        Parameters:
        subjectid - the subject to give permissions to
        resourcePath - the resource name/type
        permission - the set or HTTP methods allowed
        Returns:
        true if successful
      • grantResourcePermission

        public boolean grantResourcePermission​(String subjectid,
                                               String resourcePath,
                                               EnumSet<App.AllowedMethods> permission,
                                               boolean allowGuestAccess)
        Grants a new permission for a given subject and resource.
        Parameters:
        subjectid - the subject to give permissions to
        resourcePath - the resource name/type
        permission - the set or HTTP methods allowed
        allowGuestAccess - if true - all unauthenticated requests will go through, 'false' by default.
        Returns:
        true if successful
      • revokeResourcePermission

        public boolean revokeResourcePermission​(String subjectid,
                                                String resourcePath)
        Revokes a permission for given subject.
        Parameters:
        subjectid - subject id
        resourcePath - resource path or object type
        Returns:
        true if successful
      • revokeAllResourcePermissions

        public boolean revokeAllResourcePermissions​(String subjectid)
        Revokes all permissions for a subject id.
        Parameters:
        subjectid - subject id
        Returns:
        true if successful
      • isAllowedTo

        public boolean isAllowedTo​(String subjectid,
                                   String resourcePath,
                                   String httpMethod)
        Checks if a subject is allowed to call method X on resource Y.
        Parameters:
        subjectid - subject id
        resourcePath - resource path or object type
        httpMethod - HTTP method name
        Returns:
        true if allowed
      • permissionsContainOwnKeyword

        public boolean permissionsContainOwnKeyword​(User user,
                                                    ParaObject object)
        Check if the permissions map contains "OWN" keyword, which restricts access to objects to their creators.
        Parameters:
        user - user in context
        object - some object
        Returns:
        true if app contains permission for this resource and it is marked with "OWN"
      • addDatatype

        public void addDatatype​(String pluralDatatype,
                                String datatype)
        Adds a user-defined data type to the types map.
        Parameters:
        pluralDatatype - the plural form of the type
        datatype - a datatype, must not be null or empty
      • addDatatypes

        public boolean addDatatypes​(ParaObject... objects)
        Adds unknown types to this app's list of data types. Called on create().
        Parameters:
        objects - a list of new objects
        Returns:
        true if a new data type was added to the list
      • removeDatatype

        public void removeDatatype​(String pluralDatatype)
        Removes a datatype from the types map.
        Parameters:
        pluralDatatype - a datatype, must not be null or empty
      • resetSecret

        public void resetSecret()
        Resets the secret key by generating a new one.
      • getCredentials

        public Map<String,​String> getCredentials()
        Returns the map containing the app's access key and secret key.
        Returns:
        a map of API keys (never null)
      • addAppCreatedListener

        public static void addAppCreatedListener​(AppCreatedListener listener)
        Registers a new create listener.
        Parameters:
        listener - the listener
      • addAppDeletedListener

        public static void addAppDeletedListener​(AppDeletedListener listener)
        Registers a new delete listener.
        Parameters:
        listener - the listener
      • addAppSettingAddedListener

        public static void addAppSettingAddedListener​(AppSettingAddedListener listener)
        Registers a new app setting added listener.
        Parameters:
        listener - the listener
      • addAppSettingRemovedListener

        public static void addAppSettingRemovedListener​(AppSettingRemovedListener listener)
        Registers a new app setting removed listener.
        Parameters:
        listener - the listener
      • getId

        public final String getId()
        Description copied from interface: ParaObject
        The id of an object. Usually an autogenerated unique string of numbers.
        Specified by:
        getId in interface ParaObject
        Returns:
        the id
      • setType

        public final void setType​(String type)
        Description copied from interface: ParaObject
        Sets a new object type. Must not be null or empty.
        Specified by:
        setType in interface ParaObject
        Parameters:
        type - a new type
      • getAppid

        public String getAppid()
        Description copied from interface: ParaObject
        The application name. Added to support multiple separate apps. Every object must belong to an app.
        Specified by:
        getAppid in interface ParaObject
        Returns:
        the app id (name). default: para
      • setAppid

        public void setAppid​(String appid)
        Description copied from interface: ParaObject
        Sets a new app name. Must not be null or empty.
        Specified by:
        setAppid in interface ParaObject
        Parameters:
        appid - the new app id (name)
      • getTags

        public List<String> getTags()
        Description copied from interface: ParaObject
        The tags associated with this object. Tags must not be null or empty.
        Specified by:
        getTags in interface ParaObject
        Returns:
        a set of tags, or an empty set
        See Also:
        Tag
      • setTags

        public void setTags​(List<String> tags)
        Description copied from interface: ParaObject
        Merges the given tags with existing tags.
        Specified by:
        setTags in interface ParaObject
        Parameters:
        tags - the additional tags, or clears all tags if set to null
      • getStored

        public Boolean getStored()
        Description copied from interface: ParaObject
        Boolean flag which controls whether this object is stored in the database or not. Default is true.
        Specified by:
        getStored in interface ParaObject
        Returns:
        true if this object is stored in DB.
      • setStored

        public void setStored​(Boolean stored)
        Description copied from interface: ParaObject
        Sets the "isStored" flag.
        Specified by:
        setStored in interface ParaObject
        Parameters:
        stored - when set to true, object is stored in DB.
      • getIndexed

        public Boolean getIndexed()
        Description copied from interface: ParaObject
        Boolean flag which controls whether this object is indexed by the search engine. Default is true.
        Specified by:
        getIndexed in interface ParaObject
        Returns:
        true if this object is indexed
      • setIndexed

        public void setIndexed​(Boolean indexed)
        Description copied from interface: ParaObject
        Sets the "isIndexed" flag.
        Specified by:
        setIndexed in interface ParaObject
        Parameters:
        indexed - when set to true, object is indexed.
      • getCached

        public Boolean getCached()
        Description copied from interface: ParaObject
        Boolean flag which controls whether this object is cached. Default is true.
        Specified by:
        getCached in interface ParaObject
        Returns:
        true if this object is cached on update() and create().
      • setCached

        public void setCached​(Boolean cached)
        Description copied from interface: ParaObject
        Sets the "isCached" flag.
        Specified by:
        setCached in interface ParaObject
        Parameters:
        cached - when set to true, object is cached.
      • getTimestamp

        public Long getTimestamp()
        Description copied from interface: ParaObject
        The time when the object was created, in milliseconds.
        Specified by:
        getTimestamp in interface ParaObject
        Returns:
        the timestamp of creation
      • setTimestamp

        public void setTimestamp​(Long timestamp)
        Description copied from interface: ParaObject
        Sets the timestamp.
        Specified by:
        setTimestamp in interface ParaObject
        Parameters:
        timestamp - a new timestamp in milliseconds.
      • getCreatorid

        public String getCreatorid()
        Description copied from interface: ParaObject
        The id of the user who created this. Should point to a User id.
        Specified by:
        getCreatorid in interface ParaObject
        Returns:
        the id or null
      • setCreatorid

        public void setCreatorid​(String creatorid)
        Description copied from interface: ParaObject
        Sets a new creator id. Must not be null or empty.
        Specified by:
        setCreatorid in interface ParaObject
        Parameters:
        creatorid - a new id
      • getName

        public final String getName()
        Description copied from interface: ParaObject
        The name of the object. Can be anything.
        Specified by:
        getName in interface ParaObject
        Returns:
        the name. default: [type id]
      • setName

        public final void setName​(String name)
        Description copied from interface: ParaObject
        Sets a new name. Must not be null or empty.
        Specified by:
        setName in interface ParaObject
        Parameters:
        name - the new name
      • getPlural

        public String getPlural()
        Description copied from interface: ParaObject
        The plural name of the object. For example: user - users
        Specified by:
        getPlural in interface ParaObject
        Returns:
        the plural name
      • getParentid

        public String getParentid()
        Description copied from interface: ParaObject
        The id of the parent object.
        Specified by:
        getParentid in interface ParaObject
        Returns:
        the id of the parent or null
      • setParentid

        public void setParentid​(String parentid)
        Description copied from interface: ParaObject
        Sets a new parent id. Must not be null or empty.
        Specified by:
        setParentid in interface ParaObject
        Parameters:
        parentid - a new id
      • getUpdated

        public Long getUpdated()
        Description copied from interface: ParaObject
        The last time this object was updated. Timestamp in ms.
        Specified by:
        getUpdated in interface ParaObject
        Returns:
        timestamp in milliseconds
      • setUpdated

        public void setUpdated​(Long updated)
        Description copied from interface: ParaObject
        Sets the last updated timestamp.
        Specified by:
        setUpdated in interface ParaObject
        Parameters:
        updated - a new timestamp
      • exists

        public boolean exists()
        Description copied from interface: ParaObject
        Checks if an object is stored in the data store.
        Specified by:
        exists in interface ParaObject
        Returns:
        true if the object is persisted to the data store.
        See Also:
        DAO.read(java.lang.String)
      • voteUp

        public boolean voteUp​(String userid)
        Description copied from interface: Votable
        Upvotes the object.
        Specified by:
        voteUp in interface Votable
        Parameters:
        userid - id of voter
        Returns:
        true if successful
      • voteDown

        public boolean voteDown​(String userid)
        Description copied from interface: Votable
        Downvotes the object.
        Specified by:
        voteDown in interface Votable
        Parameters:
        userid - id of voter
        Returns:
        true if successful
      • getVotes

        public Integer getVotes()
        Description copied from interface: Votable
        Returns the total sum of all votes for this object. For example: (+6) + (-4) = 2
        Specified by:
        getVotes in interface Votable
        Returns:
        the total sum of votes
      • setVotes

        public void setVotes​(Integer votes)
        Description copied from interface: Votable
        Sets the total votes for this object.
        Specified by:
        setVotes in interface Votable
        Parameters:
        votes - the number of votes
      • getVersion

        public Long getVersion()
        Description copied from interface: ParaObject
        Returns the version number for this object. Used primarily for optimistic locking.
        Specified by:
        getVersion in interface ParaObject
        Returns:
        a positive number, 0 if unused or -1, indicating a failed update.
      • setVersion

        public void setVersion​(Long version)
        Description copied from interface: ParaObject
        Sets the version of this object. This value should come from the database.
        Specified by:
        setVersion in interface ParaObject
        Parameters:
        version - a positive number, different than the current value of the version field
      • countLinks

        public Long countLinks​(String type2)
        Description copied from interface: Linkable
        Count the total number of links between this object and another type of object.
        Specified by:
        countLinks in interface Linkable
        Parameters:
        type2 - the other type of object
        Returns:
        the number of links
      • getLinks

        public List<Linker> getLinks​(String type2,
                                     Pager... pager)
        Description copied from interface: Linkable
        Returns all links between this type object and another type of object.
        Specified by:
        getLinks in interface Linkable
        Parameters:
        type2 - the other type of object
        pager - a Pager
        Returns:
        a list of Linker objects in a many-to-many relationship with this object.
      • isLinked

        public boolean isLinked​(String type2,
                                String id2)
        Description copied from interface: Linkable
        Checks if this object is linked to another.
        Specified by:
        isLinked in interface Linkable
        Parameters:
        type2 - the other type
        id2 - the other id
        Returns:
        true if the two are linked
      • isLinked

        public boolean isLinked​(ParaObject toObj)
        Description copied from interface: Linkable
        Checks if a given object is linked to this one.
        Specified by:
        isLinked in interface Linkable
        Parameters:
        toObj - the other object
        Returns:
        true if linked
      • link

        public String link​(String id2)
        Description copied from interface: Linkable
        Links an object to this one in a many-to-many relationship. Only a link is created. Objects are left untouched. The type of the second object is automatically determined on read.
        Specified by:
        link in interface Linkable
        Parameters:
        id2 - the other id
        Returns:
        the id of the Linker object that is created
      • unlink

        public void unlink​(String type,
                           String id2)
        Description copied from interface: Linkable
        Unlinks an object from this one. Only a link is deleted. Objects are left untouched.
        Specified by:
        unlink in interface Linkable
        Parameters:
        type - the other type
        id2 - the other id
      • unlinkAll

        public void unlinkAll()
        Description copied from interface: Linkable
        Unlinks all objects that are linked to this one. Deletes all Linker objects. Only the links are deleted. Objects are left untouched.
        Specified by:
        unlinkAll in interface Linkable
      • countChildren

        public Long countChildren​(String type)
        Description copied from interface: Linkable
        Count the total number of child objects for this object.
        Specified by:
        countChildren in interface Linkable
        Parameters:
        type - the other type of object
        Returns:
        the number of links
      • getChildren

        public <P extends ParaObjectList<P> getChildren​(String type,
                                                          Pager... pager)
        Description copied from interface: Linkable
        Returns all child objects linked to this object.
        Specified by:
        getChildren in interface Linkable
        Type Parameters:
        P - the type of children
        Parameters:
        type - the type of children to look for
        pager - a Pager
        Returns:
        a list of ParaObject in a one-to-many relationship with this object
      • getChildren

        public <P extends ParaObjectList<P> getChildren​(String type,
                                                          String field,
                                                          String term,
                                                          Pager... pager)
        Description copied from interface: Linkable
        Returns all child objects linked to this object.
        Specified by:
        getChildren in interface Linkable
        Type Parameters:
        P - the type of children
        Parameters:
        type - the type of children to look for
        field - the field name to use as filter
        term - the field value to use as filter
        pager - a Pager
        Returns:
        a list of ParaObject in a one-to-many relationship with this object
      • findChildren

        public <P extends ParaObjectList<P> findChildren​(String type,
                                                           String query,
                                                           Pager... pager)
        Description copied from interface: Linkable
        Search through all child objects. Only searches child objects directly connected to this parent via the parentid field.
        Specified by:
        findChildren in interface Linkable
        Type Parameters:
        P - the type of children
        Parameters:
        type - the type of children to look for
        query - a query string
        pager - a Pager
        Returns:
        a list of ParaObject in a one-to-many relationship with this object
      • deleteChildren

        public void deleteChildren​(String type)
        Description copied from interface: Linkable
        Deletes all child objects permanently.
        Specified by:
        deleteChildren in interface Linkable
        Parameters:
        type - the children's type.
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class Object