Class App

java.lang.Object
com.erudika.para.core.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 [[email protected]]
See Also:
  • Field Details

  • Constructor Details

    • App

      public App()
      No-args constructor.
    • App

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

    • 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
    • clearSettings

      public App clearSettings()
      Clears all app settings and invokes each AppSettingRemovedListeners.
      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
    • create

      public String create()
      Description copied from interface: ParaObject
      Stores this object in the data store.
      Specified by:
      create in interface ParaObject
      Returns:
      the id of the object (a new id if object is new)
      See Also:
    • delete

      public void delete()
      Description copied from interface: ParaObject
      Deletes the object permanently by removing it from the data store.
      Specified by:
      delete in interface ParaObject
      See Also:
    • 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
    • getType

      public final String getType()
      Description copied from interface: ParaObject
      The name of the object's class. This is equivalent to Class.getSimpleName().toLowerCase()
      Specified by:
      getType in interface ParaObject
      Returns:
      the simple name of the class
    • 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)
    • getObjectURI

      public String getObjectURI()
      Description copied from interface: ParaObject
      The URI of this object. For example: /users/123
      Specified by:
      getObjectURI in interface ParaObject
      Returns:
      the URI
      See Also:
    • 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:
    • 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
    • update

      public void update()
      Description copied from interface: ParaObject
      Updates the object permanently. Changes to Locked fields are ignored.
      Specified by:
      update in interface ParaObject
      See Also:
    • 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:
    • 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.
    • getLinkedObjects

      public <P extends ParaObject> List<P> getLinkedObjects(String type, Pager... pager)
      Description copied from interface: Linkable
      Specified by:
      getLinkedObjects in interface Linkable
      Type Parameters:
      P - type of linked objects
      Parameters:
      type - type of linked objects to look for
      pager - a Pager
      Returns:
      a list of linked objects
    • findLinkedObjects

      public <P extends ParaObject> List<P> findLinkedObjects(String type, String field, String query, Pager... pager)
      Description copied from interface: Linkable
      Similar to Linkable.findChildren(java.lang.String, java.lang.String, com.erudika.para.core.utils.Pager...) but for many-to-many relationships. Searches through all linked objects connected to this via a Linker object.
      Specified by:
      findLinkedObjects in interface Linkable
      Type Parameters:
      P - type of linked objects
      Parameters:
      type - type of linked objects to look for
      field - the name of the field to target (within a nested field "nstd")
      query - a query string
      pager - a Pager
      Returns:
      a list of linked objects matching the search query
    • 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 ParaObject> List<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 ParaObject> List<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 ParaObject> List<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
    • equals

      public boolean equals(Object obj)
      Overrides:
      equals in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object