# Changes in version 3.1.2

## Of interest to users

- Fixed bug that made it impossible to create new documents if there was a category-type defined. (Issue 4380)

- Made option "linked for unauthorized users" work in searches as well as in menus. (Issue 4385)

- Fixed bug that caused template ids not to be cloned when cloning text documents. This means that for example changing the template for a newly created text document also changes the template of the parent in the cache. (Issue 4401)

## Of interest to site developers

- Fixed error when running api example "document_search.jsp" (Issue 4415)

- Fixed bug that excluded documents without a valid archived datetime from search result. (Issue 4352)

- Made the list returned by DocumentService.getDocuments(SearchQuery) modifiable. (Issue 4386)

- Fixed bug when trying to sort search result on "meta_headline". Added new non-tokenized field "meta_headline_keyword" to use for sorting on document headlines. (Issue 4415)

## Of interest to developers

- Upgrade imcode-db to version 0.3. (Issue 4389)

# Changes in version 3.1.1

## Of interest to users

- Fixed missing version number in help links. (Issue 4305)

- Fixed a bug which prevented sort keys for menuitems from being saved. (Issue 4313)

# Changes in version 3.1.0

## Of interest to users

- You can now search in PDF files, as well as in Microsoft Word, Excel, and Powerpoint files. (Issue 1855)

- Performance has been improved, so searching for documents should be much faster. (Issue 4135)

- Fixed a NullPointerException when browsing search result, for example when searching for images. (Issue 2926)

- Fixed a problem with image filenames containing spaces. (Issue 4148)

- Fixed an exception when entering an invalid text document id for an include. (Issue 4212)

- Fixed a bug where menus would cache their documents, so changes to documents would not be visible in menus immediately. (Issue 4092)

## Of interest to administrators

- You can now search for users by role, title, company, and email address. (Issue 4140, Issue 4142)

- Made sure that temporary upload files are removed in a timely manner. (Issue 4235)

- Fixed a bug where a superadmin which was also useradmin couldn't edit all roles for a user. (Issue 4117)

- Fixed a bug where the file manager would fail to change directories if the webapp was situated in a symlinked path. (Issue 4278)

## Of interest to developers

- Documents are now lazily loaded, so as to not retrieve more from the database than is needed. (Issue 4135)

- Removed the unused addon property from build.properties.template. (Issue 4233)

# Changes in version 3.0.1

## Of interest to users

- Image-paths are URL-encoded to fix problems with image-paths containing non-ASCII characters. (Issue 3646)

- Users with "restricted 1/2" permissions on a page could not save a text document if it linked to documents the user couldn't link to. (Issue 3773)

- Searches on the "phase" field of a document, such as "phase:published" or "phase:new", would search based on the time that the document was indexed, not the time of the search. Such queries are now rewritten on the fly to fix this. (Issue 3691)

## Of interest to administrators

- If there was an error while deploying, the deploy failed completely. Now the deploy succeeds, and the error appears in the browser instead. (Issue 3706)

- Fixed a problem with default values in the SQL script for MySQL 5. (Issue 3643)

- Ignore IPv6 and other non IPv4-addresses instead of choking on them. (Issue 3681)

- Added MySQL sample to server.properties. (Issue 3705)

- The upgrade SQL script diff-2-3.sql did not work in some cases, due to some foreign keys to the 'users' table changing name. (Issue 3707)

- The imCMS advertisement at the top of every page was not output when the html tag contained attributes. (Issue 3778)

- An attempt to reduce ThreadDeath errors with Tomcat has been done, by providing only commons-logging-api and calling LogFactory.releaseAll() on shutdown. (Issue 3860)

## Of interest to developers

- Source is now included for our own libraries. (Issue 3708)

- The ddlutils and commons-betwixt libraries have been updated to newer non-released versions from the Apache Subversion repository, so we don't have to keep the ddlutils version patched by us. (Issue 3914)

# Changes in version 3.0.0

## Of importance to administrators

- Removed deprecated features "conference", "billboard", "chat", "shop", "poll", "qengine", "fortune". Warning! If you are using these features, all data for them will be deleted in the upgrade! (Issue 3347)

- imCMS may now also be run on MySQL. In theory it may run on any DBMS which has a JDBC 3.0 compliant driver, but this has not been tested. (Issue 1288)

- The setting LdapUserAttribute.CountyCouncil in server.properties has been replaced by LdapUserAttribute.Province. (Issue 3537)

## Of importance to site developers

- Many methods no longer throw NoPermissionException, notably most accessors of Document and its subclasses. Permissions are instead checked when saving the document. (Issue 2980)

## Of interest to users

- The text editor now runs the MS Word-code removal filter every time you paste.

- Linking a document for which you had no permissions was impossible regardless of whether the document was "linkableByOtherUsers".

  This has been worked around so that you can add a document by entering its id, if a search for that id doesn't match another document. (Issue 3385)

- The reset button in the text editor did not work. (Issue 3469)

- Removed broken undo/redo support in the text editor until properly supported by upstream. (Issue 3468)

- Integrated jsCalendar (http://www.dynarch.com/projects/calendar/) for selecting datetimes. (Issue 3442)

- If a user with "restricted 1" or "restricted 2" permissions created a document, the default "default template" was ignored. (Issue 3409)

- Added a new default tab "Create new" to "My pages", which doesn't list documents, but allows creating new documents. (Issue 2975)

- The text editor ctrl-key combinations would ignore the alt-key. (Issue 3094)

- A non-numeric prefix in a tree menu sort key would cause an exception. (Issue 2924)

- Copying a document did not copy its menus. (Issue 2992)

- If a category type was changed it would not affect editing cached documents. (Issue 3526)

## Of interest to administrators

- Accessing /servlet/Version now prints the versions of java, the servlet container, and the database along with the imCMS version. (Issue 3519)

- It was impossible to delete some directories in the file manager. (Issue 3509)

- Disconnect from database when the webapp is shut down. (Issue 3511)

- Pressing "Add" or "Remove" when assigning templates to template groups with no templates listed would throw an exception. (Issue 3479)

- Refactored login/access_denied.jsp and login/no_permission.jsp into login/index.jsp. (Issue 3467)

- Renaming templates to already existing name would throw an exception. (Issue 3466)

- Allow superadmin to edit his/her own roles. (Issue 2935)

- Removed "List new/modified documents", and moved its functionality to the search form. (Issue 3421)

- If a role was removed, editing permissions for a cached document with that role would throw an exception. (Issue 3420)

- Prevent multiple users from being created with the same name. (Issue 3150)

- Users with the useradmin role could edit any user under certain conditions. (Issue 2757)

- Scheduled indexing may now be disabled by setting IndexingSchedulePeriodInMinutes in server.properties to "0" . (Issue 3144)

- Build index in subdirectories of WEB-INF/index instead of in WEB-INF/index.new. (Issue 3491)

- For each reload of the webapp a new background indexing thread would be started, leading to multiple concurrent indexings. This has been worked around so that an indexing thread terminates if it notices that the index has been changed. (Issue 3155)

- Some error pages were shown as html code. (Issue 3501)

- Fixed spurious NullPointerExceptions in "LRUMap.reuseMapping()" due to unsynchronized access. (Issue 2923)

- Documents were not removed from the index when deleted. (Issue 3182)

- Increased space for system message to 1000 characters. (Issue 3072)

## Of interest to site developers

- Added the method DatabaseService.getDataSource() for accessing the underlying DataSource. (Issue 3527)

- The login page now passes along parameters "next_meta" and "next_url", either of which can be used to redirect the user after login. (Issue 3433)

- Added the following methods to com.imcode.imcms.api.Document:

  - Document.getKeywords()
  - Document.setKeywords(Set)
  - Document.isLinkableByOtherUsers()
  - Document.setLinkableByOtherUsers(boolean)
  - Document.isSearchDisabled()
  - Document.setSearchDisabled(boolean)

  (Issue 2930, Issue 2931, Issue 2932)

- Deprecated the method TextDocument.MenuItem.getManualNumber(), and added the replacement methods TextDocument.MenuItem.setSortKey(Integer) and TextDocument.MenuItem.getSortKey(). (Issue 2927)

- Added method TextDocument.MenuItem.setTreeKey(TreeKey). (Issue 2928)

- Deprecated methods Document.setStatus(int) and Document.getStatus(). Added the replacement methods Document.setPublicationStatus(PublicationStatus) and Document.getPublicationStatus() and the class Document.PublicationStatus. (Issue 3037)

- Deprecated methods Document.setPermissionSetIdForRole(Role,int) and Document.getPermissionSetIdForRole(Role). Added the replacement methods Document.setPermissionSetTypeForRole(Role,DocumentPermissionSetType) and Document.getPermissionSetTypeForRole(Role) and the class DocumentPermissionSetType.

  Deprecated method DocumentPermissionSet.getType() with no replacement. (Issue 3037)

- Deprecated methods User.setCountyCouncil(String) and User.getCountyCouncil(). Added the replacement methods User.setProvince(String) and User.getProvince(). (Issue 3537)

- Added method DocumentService.deleteDocument(Document). (Issue 3428)

- Added method UserService.getUser(int). (Issue 2929)

- You can now set the creator of a new Document. (Issue 3012)

- Added class LuceneQuery which allows using the Lucene API directly. (Issue 2364)

- Including a non-existent path using an include-tag would throw a NullPointerException. (Issue 3490)

## Of interest to developers

- SQL DDL is now generated from XML source using Apache DdlUtils.

  SQL procedures previously stored in the database are now loaded from disk. Many of them have been removed. (Issue 1288, Issue 3436)

- Refactored parts of the database layer into a separate library named imcode-db. (Issue 3454)

- Removed the tools classes and extracted libraries imcode-util and imcode-ant-tasks. (Issue 3304)

- A document is always fetched from the database inside of a transaction. (Issue 3162)

- JSPs are now compiled during the build to find errors. (Issue 2089)

- Checkstyle is run during the build to find style errors. (Issue 3443)

- Building with a platform default encoding other than iso-8859-1 would fail. (Issue 3459, Issue 3462)

- A ServletContextListener is used to start up, instead of a load-on-startup servlet. (Issue 3510)

- The links on the first welcome page will now be accurate regardless of context path. (Issue 3514)

# Changes in version 2a.0.0

## Of interest to users

- Fixed a NullPointerException when trying to view a textpage containing a filedocument-image that had been deleted. (Issue 3125)

- Made <?imcms:include file="..."?> recursively parse tags. (Issue 3122)

## Of interest to site developers

- UserService.getUser(String) now returns null for non-existing users. (Issue 3167)

# Changes in version 2.2.0

## Of interest to users

- Added "Save" and "Save and close" buttons to text editor. (Issue 2937)

## Of interest to site developers

- When including other documents, the TextDocumentViewing in the request was replaced, so that subsequent TextDocumentViewings in the including document came from the included document. (Issue 3062)

# Changes in version 2.1.1

## Of interest to users

- Fixed a problem where a user would lose all his roles when editing himself. (Issue 2925)

## Of interest to site developers

- There was a mistake made with the ContentManagementSystem.runAsSuperadmin(ContentManagementSystemRunnable) method so it actually did not work at all. (Issue 2901)

# Changes in version 2.1.0

## Of importance to administrators

- Fixed a security hole that could let an attacker overwrite any file in the system. (Issue 2891)

## Of interest to users

- Only read permission on a document was required to add it to a menu. Now at least restricted 2 is required. (Issue 2895)

- Fixed a bug that made it impossible to set "edit texts" permission for restricted 1 or 2. (Issue 2885)

- Fixed a bug that would cause text in text fields to be interpreted as velocity code when displayed for editing. (Issue 2892)

- Made enter submit a text field when using "rows='1'". (Issue 2881)

- Fixed a javascript error when editing texts and using the "formats" attribute. (Issue 2879)

- The text editor would insert spurious <br />-tags when the text was empty. They are now removed when saving and when switching formats. (Issue 2890)

- Fixed an exception when trying to edit a non-existing document. (Issue 2898)

## Of interest to template creators

- Allow velocity code in all tag attributes. See TEMPLATE_SYNTAX.TXT for details. (Issue 2785)

- Whitespace in "label" -attributes are now normalized, i.e. consecutive runs of whitespace are replaced by a single space. This is a workaround for newlines in the "label" -attribute not being handled correctly in some places. (Issue 2874)

## Of interest to administrators

- Fixed a bug where deleted documents would remain in the cache. (Issue 2882)

- Allow role names of up to 60 characters, and display more than three roles at a time. (Issue 2889)

- Fixed a bug that caused text in templates to be interpreted as velocity code when displayed for editing. (Issue 2888)

- Updated jTDS to version 1.0. (Issue 2883)

- Fixed a problem where references to removed documents were retained in menus, causing NullPointerExceptions. (Issue 2894)

## Of interest to site developers

- Added package com.imcode.imcms.api.contrib, containing class DateTextFieldTextDocumentComparator, contributed by Anders Flodell and Pontus Amberg at Vetenskapsrådet. (Issue 2897)

- Added class ContentManagementSystemRunnable and method ContentManagementSystem.runAsSuperadmin(ContentManagementSystemRunnable) to allow code that has been signed by an administrator to run with superadmin-privileges.

  The following things are required to run code with superadmin-privileges:

  - KeyStorePath in server.properties must be the path of a keystore.
  - The class implementing ContentManagementSystemRunnable must be signed (e.g. inside a signed jar-file).
  - All certificates used for signing the class must be found in the keystore.

  See http://java.sun.com/docs/books/tutorial/jar/sign/ for more information about signing jar files. (Issue 2875)

- Made it possible to edit categories through the API.

  Added methods setName(), setDescription(), and setImage() to Category.

  Added method DocumentService.saveCategory(Category).

  Deprecated method DocumentService.createNewCategory(String, String, String, CategoryType). Use Category.Category(String, CategoryType) and DocumentService.saveCategory(Category) instead. (Issue 2790)

- Methods UserService.getRole(int) and UserService.getRole(String) no longer require superadmin-permissions. (Issue 2884)

- Methods TextDocument.Menu.addDocument(Document) and TextDocument.Menu.removeDocument(Document) erroneously required edit-permissions for the document added or removed, instead of the menu document as intended. (Issue 2893)

- Added fields section_id, category, category_type, and category_type_id to search index. (Issue 2887)

- Added the constants Document.LifeCyclePhase.NEW, Document.LifeCyclePhase.APPROVED, Document.LifeCyclePhase.DISAPPROVED, Document.LifeCyclePhase.PUBLISHED, Document.LifeCyclePhase.ARCHIVED, and Document.LifeCyclePhase.UNPUBLISHED, to be used as values in searches on the field "phase". (Issue 2880)

## Of interest to developers

- The java code in the tools directory were not built with source="1.4" and target="1.4". This caused parts of imCMS to break when compiled with java 1.5 and run on java 1.4. (Issue 2878)

# Changes in version 2.0.0

## Of importance to users

- New url format for documents: /imcms/1001 instead of /imcms/servlet/GetDoc?meta_id=1001. The old format still works, but this means that relative links in pages are likely to break. (Issue 1163)

- To alleviate broken relative links, /imcms/GetDoc?meta_id=1001 now works as well as /imcms/servlet/GetDoc?meta_id=1001. (Issue 2727)

## Of importance to administrators

- We're now using jTDS instead of Microsofts JDBC driver. The Microsoft driver may still somewhat work, but it is strongly recommended that you use jTDS instead. To do this, change the following values in server.properties:

  - Set JdbcDriver to "net.sourceforge.jtds.jdbc.Driver"
  - Set JdbcUrl to "jdbc:jtds:sqlserver://<host>:<port>/;AppName=imCMS;DatabaseName=<databasename>" substituting correct values for <host>, <port>, and <databasename>.

  (Issue 1850)

- We require javamail 1.3 or later, but Tomcat 4.1.30 and earlier includes javamail 1.2, which overrides our included implementation (GNU classpathx javamail).

  If you're using Tomcat 4.1.30 or earlier, you can do one of three things:

  - Recommended: Upgrade Tomcat to version 4.1.31 or later.
  - Remove mail.jar and activation.jar from tomcat/common/lib. If you use any web applications that require any of them, you can put them in the WEB-INF/lib directory of those applications. imCMS will use its own implementation.
  - Replace mail.jar in the directory tomcat/common/lib with mail.jar from JavaMail 1.3 or later. JavaMail can be downloaded from http://java.sun.com/products/javamail/downloads/

  If you are using another servlet engine that includes an older implementation of javamail, similar action may be required. (Issue 2859)

- Specifically, the new url format is <contextpath><prefix><document-id>, e.g. /imcms<prefix>1001. The <prefix> can be set with the setting DocumentPathPrefix in server.properties. The default is "/" . Comment this out to disable the new url format. (Issue 2733)

- The latest documents requested from the database are now cached in memory. This makes imCMS much faster, but means that changes to the database won't be seen. The maximum number of documents cached can be set using DocumentCacheMaxSize in server.properties. The default is to cache at most 100 documents. (Issue 2083, Issue 2864)

- All the class-files that used to live in WEB-INF/classes are now packaged in one jar file in WEB-INF/lib. (Issue 2746)

- Some objects were put in sessions when editing documents, and never removed. These are now removed when no longer needed. This might reduce memory usage a bit. (Issue 2750)

## Of interest to users

- A new function called "My pages" gives you an easy overview of your documents. It is accessible through the "admin" button for users which have any role that has permission to access "My pages". (Issue 2578)

- A new better html editor (http://www.dynarch.com/projects/htmlarea/) which also supports Mozilla browsers has been incorporated. (Issue 2548)

- The search page now allows much more advanced searches. (Issue 2578)

- File extension "dot" is now recognized as a Microsoft Word file. (Issue 2681)

- File extension "ppt" is now recognized as a Microsoft Powerpoint file. (Issue 2743)

- Updated the look of the user interface a bit, notably the adminbuttons and the template dialog. (Issue 2796)

- One can now on the permission page set a default template to be used for new text documents. (Issue 2451)

- Don't display a broken image for an empty image field. (Issue 2567)

- Fixed problem with previewing images with non-ASCII characters in the name in the image browser. (Issue 2653)

- Don't show button to upload images if lacking permission to do so. (Issue 2734)

- Changed certain file uploading error messages to be somewhat clearer. (Issue 2591)

- Fixed a problem where users were allowed to access the document "page info" without proper permissions. (Issue 2680)

- Set creation date to "now" for copies of documents. (Issue 2737)

- Fixed help message on "file edit page". (Issue 2682)

- The OK button on the document "page info" page was unclickable in Safari on Mac due to a javascript. (Issue 2703)

- Hide categories on "page info" page if none exist. (Issue 2794)

- Added shortcut buttons to set dates to "Now" on "page info" page. (Issue 2794)

- The creator and some dates were not set properly for copied documents. (Issue 2803)

- Removed misleading instructions on how to create documents. (Issue 2799)

- Fixed problem with data for browser documents not being saved on creation. (Issue 2839)

- Missing schemes are now automatically added to urls. (Issue 2860)

- The link checker now handles relative and schemeless urls. (Issue 2861)

- When editing menus, for each menu display two numbers.

  One number is the number of documents a visitor to the site would see in the menu, and the other number is the number of documents the current user can see when editing the menu. (Issue 2800)

- Allow setting the link target when editing a file document. (Issue 2771)

## Of interest to template creators

- Added the file TEMPLATE_SYNTAX.TXT containing a basic reference to the template tags. (Issue 2689)

- Local includes can now be made using <?imcms:include path="/relative/to/context/path"?>. These don't require a http-request to localhost as url-includes do, are a magnitude more efficient, and don't spam the access-log. (Issue 2684)

- Jakarta Velocity can now be used in templates, between <?imcms:velocity?> ... <?/imcms:velocity?> tags. See the file TEMPLATE_SYNTAX.TXT for details. (Issue 2668)

- Attributes "pre" and "post" can now be used on <?imcms:menu?>. (Issue 2668)

- Attributes in tags can now be html-escaped, like so: <?imcms:text label="&quot;quoted text&quot;"?>. (Issue 2783)

- New attribute for <?imcms:menu?>: "defaulttemplate" - specify the name of a template to use for new text documents created in this menu. (Issue 2689)

- New attribute for <?imcms:text?>: "formats" - specify what editor modes are available. (Issue 2709)

- New attribute for <?imcms:text?>: "rows" - indicate the preferred number of rows to the editor. (Issue 2764)

## Of interest to administrators

- When something went wrong during initialization, a useless generic "NoClassDefFoundError" was given. (Issue 2669)

- Certain html files were not viewable in the file manager. (Issue 2661)

- Fixed a problem in the diff-1.10.2-1.11.sql database upgrade script. (Issue 2692)

- Fixed an error when trying to edit a user. (Issue 2696)

- Make sure a useradmin only can list users he can edit. (Issue 2757)

- Sometimes when using the file administrator, some files would be unremovable. Trying to remove them will now give a rather nasty error message instead of failing silently. This still needs improvement. (Issue 2442)

- The link checker is now multithreaded, and one can choose to list only broken links. Also, one can specify a range of document ids to check. (Issue 2587, Issue 2789)

- Use a default value of "1440" (24 hours) for IndexingSchedulePeriodInMinutes if missing from server.properties. (Issue 2786)

- Reversed sort order of "List new/updated pages". (Issue 2842)

- Allow to set no roles for users, leaving only the "Users"-role. (Issue 2806)

- Fixed a problem with mismatched filenames in the chat on case-sensitive filesystems. (Issue 2845)

- Empty passwords are no longer allowed for external authentication, e.g. LDAP. (Issue 2847)

- Updated the look of the "Edit external user" page. (Issue 2334)

- Fixed a problem with modified date of a document only being updated on every second save. (Issue 2858)

- The checksums in WEB-INF/version.txt are now in WEB-INF/checksums.txt instead, and are not output by the "Version" servlet. (Issue 2865)

- Made a "RebuildIndex" servlet for rebuilding the index, and fixed the "Restart" servlet to do a more thorough/proper restart of imCMS. (Issue 2855)

- Don't allow removing a template group that contains templates. (Issue 2836)

- Don't print password to log when failing to log in to an LDAP server. (Issue 2828)

- List users in order of last name and first name instead of by id. (Issue 2821)

## Of interest to site developers

- Created package com.imcode.util with generic non-imCMS-specific utilities:

  ChainableReversibleNullComparator
    - Moved here from com.imcode.imcms.api.util
  ComparatorWrapper
    - Moved here from com.imcode.imcms.api.util
  HumanReadable
    - Get human readable byte sizes and time spans.
  ImageSize
    - Get the size of an image in somewhat more efficient manner than ImageIO.read().
  MultipartHttpServletRequest
    - Extends HttpServletRequest for file upload with support from Jakarta Commons-FileUpload.

  (Issue 2493)

- Users can now change their own attributes. (Issue 2708)

- Added classes:

  Role
    - Represents a user-role.
  SaveException
    - Thrown when something can't be saved.
  AlreadyExistsException
    - Extends SaveException.
  TextDocumentViewing
    - Accessible in included JSPs and velocity code. Represents one viewing of a text document.

  (Issue 2676, Issue 2776)

- Changed classes:

  MaxCategoriesOfTypeExceededException
    - Extends SaveException
  CategoryAlreadyExistsException
    - Extends AlreadyExistsException
  CategoryTypeAlreadyExistsException
    - Extends AlreadyExistsException
  UserAlreadyExistsException
    - Extends AlreadyExistsException
  RoleAlreadyExistsException
    - Extends AlreadyExistsException

- Deprecated classes:

  com.imcode.imcms.api.util.ChainableReversibleNullComparator
    - Moved to com.imcode.util
  com.imcode.imcms.api.util.ComparatorWrapper
    - Moved to com.imcode.util

- Added methods:

  ContentManagementSystem.fromRequest(ServletRequest)
    - Get the ContentManagementSystem.
  Document.setPermissionSetIdForRole(Role,int)m
    - Replaces Document.setPermissionSetForRole(String,int)
  Document.getPermissionSetIdForRole(Role)
    - Get the permission set id for a role
  DocumentService.getSection(String)
    - Get a section by name.
  Section.getId()
    - Get the id for a section.
  TextDocument.Menu.getVisibleDocuments()
    - Returns the documents visible in the menu.
  TextDocument.Menu.getVisibleMenuItems()
    - Returns the menuitems visible in the menu.
  User.getRoles()
    - Get the user's roles.
  User.setRoles(Role[])
    - Set the user's roles.
  User.hasRole(Role)
    - Returns true if the user has the role.
  User.addRole(Role)
    - Add a role to the user.
  User.removeRole(Role)
    - Remove a role from the user.
  UserService.createNewRole(String)
    - Create a new role
  UserService.deleteRole(Role)
    - Delete a role, requires superadmin permission.
  UserService.getAllRoles()
    - Returns all roles in the system, requires superadmin permission.
  UserService.getAllUsersWithRole(Role)
    - Get all users with the given permission.
  UserService.getRole(int)
    - Get a role by id, requires superadmin permission.
  UserService.getRole(String)
    - Get a role by name, requires superadmin permission.
  UserService.saveRole(Role)
    - Save changes to the role, requires superadmin permission.
  UserService.createNewUser(String, String)
    - Create a new user.
  UserService.saveUser(User)
    - Save a new or existing user, requires superadmin permission.
  User.set*
    - Added a bunch of setters.
  User.get*
    - Added a few missing getters.

  (Issue 2648, Issue 2648, Issue 2677, Issue 2827, Issue 2827)

- Changed methods:

  DocumentService.saveChanges(Document)
    - Throws SaveException instead of MaxCategoriesOfTypeExceededException.
  TextDocument.setInclude(int,TextDocument)
    - Now requires you to call DocumentService.saveChanges() afterwards.
  TextDocument.Menu.getDocuments()
    - Returns the same documents as can be seen when editing the menu.
  TextDocument.Menu.getMenuItems()
    - Returns the same menuitems as can be seen when editing the menu. No longer throws NoPermissionException.
  UserService.addNewRole(String)
    - Returns the new role.

  (Issue 2827, Issue 2827)

- Undeprecated methods:

  TextDocument.setTemplate(Template)
    - Use when you don't care about setting a template group.

  (Issue 2791)

- Deprecated methods:

  Document.setPermissionSetForRole(String,int)
    - Use Document.setPermissionSetIdForRole(Role,int).
  User.getRoleNames()
    - Use User.getRoles()
  User.hasRole(String)
    - Use User.hasRole(Role)
  UserService.deleteRole(String)
    - Use UserService.deleteRole(Role)
  UserService.getAllUserWithRole(String)
    - Use UserService.getAllUsersWithRole(Role)
  UserService.getRoleNames(User)
    - Use User.getRoles()
  UserService.getAllRolesNames()
    - Use UserService.getAllRoles()
  UserService.setUserRoles(User,String[])
    - Use User.setRoles(Role[])
  UserService.addNewRole(String)
    - Use UserService.createNewRole(String) and UserService.saveRole(Role)

- Removed methods:

  DocumentService.createAndSaveNewTextDocument(Document)
    - Use DocumentService.createNewTextDocument() and DocumentService.saveChanges(Document)
  DocumentService.createAndSaveNewUrlDocument(Document)
    - Use DocumentService.createNewUrlDocument() and DocumentService.saveChanges(Document)

## Of interest to developers

- Unit tests are now enabled in the build by default. (Issue 2664)

- Target "copy-web" in an addon build.xml is now run when running the "web"-target in the main build.xml. (Issue 2674)

- Use jsp for "edit text" page. (Issue 2549)

- Added a unique index on column "login_name" in table "users". (Issue 2663)

- Compileable with java 1.5. (Issue 2687)

- Updated jars to the latest versions, and made sure all have understandable names with version numbers. (Issue 2686)

- Getting the size of an image was very slow. (Issue 2685)

- The column "role_id" in the table "roles" is now an identity column, and "role_name" is varchar(60).

- Don't update menus in database if they don't differ from the cache when saving a text-document. (Issue 2672)

- Fixed a problem where clones of users would share the same set of roles. (Issue 2701)

- Added possibility to set permissions for roles. (Issue 2705)

- Fixed hardcoded urls to the documentation site in the default template. (Issue 2718)

- Removed table "roles_permissions", no longer needed. (Issue 2705)

- All users are now always considered to have the "Users" role regardless of what the database says. (Issue 2770)

- Made an ant-target "distcheck" for verifying that the source distribution is buildable. (Issue 2774)

- Made it easier to build with LDAP enabled (Issue 2818)

- Texts are doubly indexed: With and without HTML-tags. (Issue 2775)

- Introduced the concept of LifeCyclePhase for a DocumentDomainObject (indexed as "phase"), corresponding to what users think of as "status". (Issue 2855)

- A group can now be used as the to-address of e-mails. (Issue 2798)

- The changelog (previously CHANGES.TXT, now CHANGES.HTML) is now generated from an xml-file using an xsl-stylesheet. (Issue 2765)

# Changes in version 1.11.1

## Of interest to administrators

- In the fix to bug 2452 in 1.11.0, we changed the way files in file documents are saved to disk, forgetting backwards-compatibility. Administrators had to remove the "_se"-suffix from all files under "WEB-INF/uploads", or the files would not be found after an upgrade. This was fixed so the "_se" suffix is recognized again, and will be automatically removed when the file document is saved. Removing the suffix from the files on upgrade is still recommended. (Issue 2452, Issue 2650)

- On a related note, don't show "WEB-INF/uploads" in "FileAdmin" by default. (Issue 2640)

- Made "/RD/*"-paths (as seen in the log) work again. (Issue 2633)

# Changes in version 1.11.0

## Of importance to administrators

- The "SelectMethod" in the JdbcUrl in "server.properties" MUST be set to "SelectMethod=cursor", otherwise you will get the error "Can't start a cloned connection while in manual transaction mode." when you try to save a document. This is due to the new transaction code. The default used to be "SelectMethod=direct". (Issue 2569)

## Of interest to users

- Made it possible to upload several files in one filedocument. (Issue 2452)

- Fixed a race condition that could cause menus to be cleared when editing a text-document. (Issue 2569)

- File-extension "xls" on uploaded files is now recognized as a Microsoft Excel Spreadsheet. (Issue 2534)

- Fixed a problem with viewing uploaded PDF files with Adobe Acrobat 6.0.1. (Issue 2511)

- Fixed exception when trying to create an HTML-document. (Issue 2543)

- Changed some swedish names for different document types. (Issue 1496)

- Some form elements looked strange in "page info" in Internet Explorer 5.2 on Macintosh. (Issue 2391)

- Fixed a bug that made it hard to remove images. (Issue 2567)

- Show file-size on file-document-files and images. (Issue 2520)

- Distinguish directories in "FileAdmin" with gray background color, sort files and directories in alphabetical order, and make file-sizes more readable. (Issue 2572)

- Fixed a bug making it impossible to delete a text-document with more than one menu. (Issue 2585)

- HTML is now removed from text-fields before indexing, so a search for "foo bar" will now also find "<em>foo</em> bar". (Issue 2593)

- Changed swedish name of text-document, "Ny sida" to "Textsida". (Issue 1496)

- Image-preview in old image archive was broken. (Issue 2628)

- Submitting the form several times (i.e. by double-clicking) when creating a new document no longer results in an error message and several documents created. (Issue 2607)

## Of interest to template creators

- Put the imCMS-commercial html-comment (imcms_message.html) before the <html>-tag instead of the before doctype declaration. (Issue 2623)

## Of interest to administrators

- Disallow editing of user "user". (Issue 2479)

- Fixed a bug that made it impossible to create a category. (Issue 2514)

- Fixed a bug that prevented changing a category-type from multi-choice to single-choice. (Issue 2515)

- Database connections are now tested before use. This allows imCMS to survive database server restarts. (Issue 2144)

- "IndexingSchedulePeriodInMinutes" in "server.properties" now controls the time period between reindexings in minutes. (Issue 2614)

- Reindexing is no longer performed on startup unless needed. (Issue 2625)

- Added a little note about running SQL-scripts to INSTALL.TXT. (Issue 2484)

- The admin button is now visible for users with role "Useradmin" again. (Issue 2629)

## Of interest to site developers

- Category now implements Comparable. Compares by name, ignoring case.

- UserService.getUser(String) no longer requires superadmin permissions. (Issue 2527)

- Added classes: - MailService - provides methods for sending e-mail. - Mail - represents a mail to be sent with MailService. Uses javax.activation.DataSource for attachments. - MailException - thrown by MailService. - FileDocument - represents a filedocument - FileDocument.FileDocumentFile - represents a single file in a filedocument. Implements javax.activation.DataSource. (Issue 2490, Issue 2490, Issue 2551, Issue 2551, Issue 2551)

- Added methods: - ContentManagementSystem.getMailService() - - DocumentService.createNewFileDocument() - - DocumentService.getXmlDomForDocument() - returns an org.w3c.dom.Document representing a document. Currently only works with text-documents. - Image.getSrc(String contextPath) - returns image-src with contextPath prepended. - Image.getSrcRelativeToContextPath() - returns image-src without contextPath prepended. - Image.getSize() - returns the size of the image in bytes. - User.getId() - returns the user id. - User.isDefaultUser() - returns true if the user is the default user ("user/user"). - DocumentPermissionSet.getEditMenusPermission() - returns true if this permission-set allows editing of menus. - DocumentPermissionSet.setEditMenusPermission(boolean) - sets whether this permission-set allows editing of menus. (Issue 2490, Issue 2491, Issue 2491, Issue 2491, Issue 2551, Issue 2551, Issue 2609, Issue 2609, Issue 2616, Issue 2616)

- Removed methods: - Image.getSrc() - use Image.getSrc(String contextPath) or Image.getSrcRelativeToContextPath() - Image.getSrcUrl() - use Image.getSrc(String contextPath) or Image.getSrcRelativeToContextPath() This was necessary to completely remove imCMS dependence on a specific context path. (Issue 2491, Issue 2491)

- Removed deprecated fields: - Document.Comparator.ACTIVATED_DATETIME - use Document.Comparator.PUBLICATION_START_DATETIME

- Removed deprecated methods - Document.setModifiedDateTime(Date) - use Document.setModifiedDatetime(Date) - Document.getModifiedDateTime() - use Document.getModifiedDatetime() - Document.getCreatedDateTime() - use Document.getCreatedDatetime() - TextDocument.getMenuSortOrder() - use Menu.getSortOrder() - TextDocument.setMenuSortOrder(int) - use Menu.setSortOrder(int) - DocumentPermissionSet.getEditHeadlinePermission() - use DocumentPermissionSet.getEditDocumentInformationPermission() - DocumentPermissionSet.setEditHeadlinePermission(boolean) - use DocumentPermissionSet.setEditDocumentInformationPermission(boolean) - DocumentPermissionSet.getEditableMenuDocumentTypeNames() - removed, returning type-names is broken. (Issue 2560, Issue 2560, Issue 2609, Issue 2609, Issue 2609)

## Of interest to developers

- The document-deletion procedure is now run in an transaction. (Issue 2495)

- It's now possible to send attachments with mails. This uses the Java Activation Framework (javax.activation) and JavaMail API implementations from the GNU classpathx project. (Issue 2542)

- Replaced imCMS own image-parsing routines with javax.imageio.ImageIO (Issue 2493)

- Started to change the database API to allow for transactions. (Issue 2569)

- Text document menus are now saved inside a transaction. (Issue 2569)

# Changes in version 1.10.3

## Of interest to site developers

- Added constants for use in search-strings: - TextDocument.TYPE_ID - UrlDocument.TYPE_ID

- Added methods: - boolean User.isSuperAdmin() - boolean User.canEdit(Document) - String[] User.getRoleNames() - DocumentService.createNewTextDocument(Document) - DocumentService.createNewUrlDocument(Document) (Issue 2521, Issue 2521)

- Deprecated methods: - DocumentService.createAndSaveNewTextDocument(Document) - DocumentService.createAndSaveNewUrlDocument(Document)

## Of interest to administrators

- The ldap implementation should no longer be dependent on Microsoft Active Directory. Rewrote a big part of the ldap-configuration in "server.properties": - "LdapUserName" is replaced by "LdapBindDn", - "LdapUserObjectClass" is set to "inetOrgPerson" by default. - "LdapUserIdentifyingAttribute" is replaced by "LdapUserAttribute.LoginName" which is only required if not using 'uid' in the "inetOrgPerson" objectclass. Ldap-attributes can now be arbitrarily mapped to user-properties. See the comments in "server.properties" for details. (Issue 1981, Issue 2516)

- Fixed a bug where removing a single phone number from a user had no effect. (Issue 2471)

- Use dos-style line-endings in the text-files in the zip file, and unix-style line-endings in the tarball. (Issue 2485)

## Of interest to developers

- Instead of empty strings, use "localhost" for default database-host and "imcms" for default database-name. (Issue 2488)

# Changes in version 1.10.2

## Of interest to site developers

- Added method Image.isEmpty() to determine whether an image is empty or not. (Issue 2344)

- Image.getWidth() and Image.getHeight() now return the actual size of the image as it will be displayed, instead of 0, unless the actual size couldn't be determined. (Issue 2475)

- Fixed a bug which caused includes to be done with the included document in adminmode. (Issue 2449)

- Image-tags containing filedocument-images are hidden from users without permissions to the filedocument. (Issue 2454)

- Fixed a mistake which prevented the imCMS-advertisement in "imcms_message.html" from being output at the beginning of every page. (Issue 2445)

- Allow files with extensions "jsp" and "js" to be edited in the file administrator ("FileAdmin"). (Issue 2406)

- Build a zip file/tarball so people don't have to download more than one file. (Issue 2460)

- Fixed a number of problems with the conference login. (Issue 2419)

- Fixed a bug with the linkeditor in browsers other than Internet Explorer. (Issue 2462)

- Made the html-editor optional through the use of a cookie. (Issue 2327)

- Fixed a bug with creating external links in the html-editor. (Issue 2418)

- Fixed a couple of bugs related to creating new conferences and new conference-users.

- Made listing many users somewhat quicker. (Issue 2316)

# Changes in version 1.10.1

## Of interest to

- Fixed exception and possible menu-deletion when trying to readd an already existing document to a menu sorted by "manual" order. (Issue 2443)

- Included both english and swedish sql scripts in the distribution.

# Changes in version 1.10.0

## Of interest to users

- Filedocuments of types "png", "gif", or "jpeg" can now be used as images. (Issue 2128)

- Completely redid the image-selecting interface to allow for the new filedocuments-as-images paradigm. (Issue 2128)

- Replaced dropdown for selecting document publisher with a user-select dialog, and made the document creator settable in the same manner. (Issue 2149)

- Allow filedocument filenames of up to 255 characters, truncating somewhat intelligently if needed. (Issue 2088)

- Only show links to documents which the user has at least read permission on, or which are visible to non-authorized users. (Issue 2387)

- Fixed exception when adding documents to a menu sorted by "manual" order. (Issue 2390)

- Setting the modified time of a document is now possible, but it will still be updated the next time the document is modified. (Issue 2367)

## Of interest to template creators

- The label attribute now works for the include-tag: <?imcms:include label="Include label"?> (Issue 1622)

- The outputdescription-attribute of the documentcategories tag now takes two values, "true" or "only": - "true": <?imcms:documentcategories outputdescription="true"?> will output "categoryname - categorydescription" - "only": <?imcms:documentcategories outputdescription="only"?> will output "categorydescription" - Not present: <?imcms:documentcategories?> will output "categoryname". (Issue 2151)

## Of interest to administrators

- The file "host.properties" is gone, and everything is put in "server.properties". (Issue 2424)

- Worked a little more on indexing robustness. (Issue 2354)

- Made the indexing work at a lower priority. (Issue 2362)

- Remove documents from the index when deleted. (Issue 2365)

- Fixed a bug in the linkchecker where some broken links would be flagged as OK. (Issue 2336)

- If "SessionCookieDomain" is set in "server.properties", a second JSESSIONID cookie will be set with the given domain. (Issue 1886)

## Of interest to site developers

- Added methods TextDocument.getTextFields(), TextDocument.getImages(), and TextDocument.getIncludes() (Issue 2344)

- Added accessors Document.setVisibleInMenusForUnauthorizedUsers(boolean visibleInMenusForUnauthorizedUsers) and Document.isVisibleInMenusForUnauthorizedUsers() (Issue 2351)

- Added accessor Document.setCreator(User creator) (Issue 2388)

- Added method Document.getDocumentPermissionSetForUser() (Issue 2153)

- Added accessors TextDocument.Menu.getSortOrder() and TextDocument.Menu.setSortOrder(int sortOrder) (Issue 2438)

- Added method TextDocument.getMenus() (Issue 2438)

## Of interest to developers

- Removed user-"categories". (Issue 2149)

- Refactored the code for creating and editing documents. (Issue 2039)

# Changes in version 1.9.3

## Of interest to

- Only show links to documents which the user has at least read permission on, or which are visible to non-authorized users. (Issue 2387)

# Changes in version 1.9.2

## Of interest to

- Fixed exception when adding documents to a menu sorted by "manual" order. (Issue 2390)

- Remove documents from the index when deleted. (Issue 2365)

# Changes in version 1.9.1

## Of interest to

- Made the indexing a little more robust.

# Changes in version 1.9.0

## Of interest to users

- Simple/advanced view toggle for docinfo.

- Admin-pages will now work on non-javascript-enabled browsers.

- All admin-pages now use the new blue/white look.

- The link checker will now also check linked images and urls in text-fields.

- "Administer conferences" functionality moved to "List new/updated pages".

- The session counter now counts sessions, not logins. This means that each visitor is only counted once per browser session, instead of once when entering the site and then again when logging in.

## Of interest to template creators

- New template tag: <?imcms:contextpath?> will be replaced by the "context path" of the webapp. The context path is the root path to the webapp, usually the name of the webapp preceded by a slash, for example "/imcms". This is useful when one wants to construct an absolute URL. Example: <img src="<?imcms:contextpath?>/images/imCMSpower.gif" alt="Powered by imCMS">

## Of interest to administrators

- The webapp should now be possible to rename without having to change any templates.

- We now return correct HTTP status codes: 404 for "Not found", and 403 for "Forbidden/Permission denied".

- Changed database parameters to allow for different database-drivers: The parameters "Url", "Host", "Port", "DatabaseName" in imcms/WEB-INF/conf/server.properties were replaced by the single option "JdbcUrl", which for the Microsoft JDBC driver maps to the old parameters as follows: jdbc:microsoft:sqlserver://<Host>:<Port>;DatabaseName=<DatabaseName>

- The "MaxConnectionCount" in server.properties is ignored by the Microsoft JDBC Driver, unless one sets the driver parameter "SelectMethod" to "cursor". To do this, append ";SelectMethod=cursor" (note the semicolon) to the JdbcUrl. The default is "SelectMethod=direct", and this causes the MS JDBC driver to clone connections internally. See http://support.microsoft.com/default.aspx?scid=kb;EN-US;313220 for more information.

- Conference, billboard, and chat should now work on case sensitive filesystems, for example on linux.

- Reindexing of documents is now scheduled every 24 hours from startup. Reindexing is done to a new directory, "imcms/WEB-INF/index.new", which replaces the current index "imcms/WEB-INF/index" when complete.

## Of interest to site developers

- Moved the apisamples from "/apisamples/" to "/imcms/docs/apisamples/".

- DocumentService.saveChanges(Document) is now synchronized as a poor mans transaction to prevent database conflicts.

- Added method DocumentService.getCategoryType(int categoryTypeId)

- Added method DocumentService.createNewCategoryType(String name, int maxChoices)

- Added method DocumentService.createNewCategory(String name, String description, String imageUrl, CategoryType categoryType)

- Added method TemplateService.getAllTemplateGroups()

- Added accessors Template.getId() and TemplateGroup.getId().

- Added convenience method DocumentService.parseLuceneSearchQuery(String) which returns a SearchQuery parsed according to Lucene syntax, see http://jakarta.apache.org/lucene/docs/queryparsersyntax.html

## Of interest to developers

- Cleaned up the file organization in the project.

- Renamed all the ant-targets using more consistent names.

- The API now has its own connection pool, so developers using the API can't accidentally starve the system of connections.

- Jakarta Velocity (http://jakarta.apache.org/velocity/) can now be used in admintemplates and JSP-pages.

- Searchable tokens in the index may now only consist of letters, digits, and underscores, instead of non-whitespace. This makes html index a little bit better, so that for example <b>bold</b> is indexed as two words ("b" and "bold").