Index: macosx_installer/lams_code/common.properties =================================================================== diff -u --- macosx_installer/lams_code/common.properties (revision 0) +++ macosx_installer/lams_code/common.properties (revision 2f8b6c47ef1411326bfe97c5d2d991aa681f0006) @@ -0,0 +1,105 @@ +# Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) +# License Information: http://lamsfoundation.org/licensing/lams/2.0/ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2.0 +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +# USA +# +# http://www.gnu.org/licenses/gpl.txt + +# project-wide properties +project=LAMS +project_version=2.1 + +# which application are we trying to build? LAMS or RAMS +conf.application=lams +#conf.application=rams + +# which o/s related property file do you want? valid values "windows" or "unix" +osPropertiesName=unix + +#Tool information +name=lams_tool_${signature} +product=lams-tool-${signature} +toolContext=/${conf.application}/tool/${signature} + +# Directory where third party jars reside. +sharedlib=../lams_build/lib + +#deploy tool directory +deploy.tool.dir=../lams_build/deploy-tool + +#deploy tool directory +tag.web.dir=../lams_central/web/WEB-INF + +#database access +db.name=lams2 +db.driver=com.mysql.jdbc.Driver +db.url=jdbc:mysql://localhost/${db.name}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useUnicode=true +db.encoding=utf8 +db.username=root +db.password= +db.driver.jar=${sharedlib}/mysql/mysql-connector-java-5.0.8-bin.jar +db.scripts=${basedir}/db/sql +db.schema= +db.catalog= + +# db scripts +lamsconf.table.sql=insert_${conf.application}_${osPropertiesName}_config_data.sql + +#xdoclet version number +xdoclet.version=1.2.3 + +#configuration files +conf.dir=${basedir}/conf +conf.xdoclet.dir=${conf.dir}/xdoclet +conf.middlegen.dir=${conf.dir}/middlegen +##Hibernate +conf.hibernate.dir=${conf.dir}/hibernate +conf.hibernate.mapping.dir=${conf.hibernate.dir}/mappings + +##WEB +conf.web.dir=${basedir}/web +conf.webinf.dir=${conf.web.dir}/WEB-INF +conf.struts.dir=${conf.webinf.dir}/struts + +##Language Files +# conf.language.dir is the directory containing all the language files for all the tools, learning, monitoring, etc. +conf.language.dir=${conf.dir}/language/${conf.application} + +# Build directory +build=${basedir}/build +build.classes.java=${build}/classes/java +build.classes.test=${build}/classes/test/java +build.lib=${build}/lib +build.report=${build}/report +build.web=${build}/web +build.deploy=${build}/deploy +build.sql=${build}/sql + +# Source directory under the current root +src.dir=${basedir}/src +src.java.dir=${src.dir}/java +src.test.dir=${basedir}/test/java + +#JBoss deploy directory - see OS dependent properties file + +#middlegen properties +middlegen = ${conf.dir}/middlegen +middlegen.gui = true + +#web application properties +sessiontimeout=120 + +# are we generating the tool deploy packages for an upgrader. Normally this is false +generate.for.installers=false \ No newline at end of file Index: macosx_installer/lams_code/compile.sh =================================================================== diff -u --- macosx_installer/lams_code/compile.sh (revision 0) +++ macosx_installer/lams_code/compile.sh (revision 2f8b6c47ef1411326bfe97c5d2d991aa681f0006) @@ -0,0 +1,13 @@ +#!/bin/sh +cd lams_common/ +echo "Rebuilding db" +ant rebuild-db +cd ../lams_build/ +echo "Assembling EAR" +ant assemble-ear +echo "Deploying EAR" +ant deploy-ear +echo "Deploying Tools" +ant deploy-tools +echo "Copying files" +ant copyfiles Index: macosx_installer/lams_code/cvsupdate.sh =================================================================== diff -u --- macosx_installer/lams_code/cvsupdate.sh (revision 0) +++ macosx_installer/lams_code/cvsupdate.sh (revision 2f8b6c47ef1411326bfe97c5d2d991aa681f0006) @@ -0,0 +1,3 @@ +#!/bin/sh + +cvs -z3 -d :pserver:anonymous@lamscvs.melcoe.mq.edu.au:/usr/local/cvsroot co -r lams2_3_4 all Index: macosx_installer/lams_code/insert_lams_unix_config_data.sql =================================================================== diff -u --- macosx_installer/lams_code/insert_lams_unix_config_data.sql (revision 0) +++ macosx_installer/lams_code/insert_lams_unix_config_data.sql (revision 2f8b6c47ef1411326bfe97c5d2d991aa681f0006) @@ -0,0 +1,254 @@ +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ServerURL','http://localhost:8080/lams/', 'config.server.url', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ServerURLContextPath','lams/', 'config.server.url.context.path', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('Version','2.3.4', 'config.version', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('TempDir','/usr/local/lams/temp', 'config.temp.dir', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('DumpDir','/usr/local/lams/dump', 'config.dump.dir', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('EARDir','/usr/local/lams/jboss-4.0.2/server/default/deploy/lams.ear/', 'config.ear.dir', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('SMTPServer','', 'config.smtp.server', 'config.header.email', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LamsSupportEmail','', 'config.lams.support.email', 'config.header.email', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ContentRepositoryPath','/usr/local/lams/repository', 'config.content.repository.path', 'config.header.uploads', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('UploadFileMaxSize','1048576', 'config.upload.file.max.size', 'config.header.uploads', 'LONG', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('UploadLargeFileMaxSize','10485760', 'config.upload.large.file.max.size', 'config.header.uploads', 'LONG', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('UploadFileMaxMemorySize','4096', 'config.upload.file.max.memory.size', 'config.header.uploads', 'LONG', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ExecutableExtensions','.bat,.bin,.com,.cmd,.exe,.msi,.msp,.ocx,.pif,.scr,.sct,.sh,.shs,.vbs', 'config.executable.extensions', 'config.header.uploads', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('UserInactiveTimeout','86400', 'config.user.inactive.timeout', 'config.header.system', 'LONG', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('UseCacheDebugListener','false', 'config.use.cache.debug.listener', 'config.header.system', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('CleanupPreviewOlderThanDays','7', 'config.cleanup.preview.older.than.days', 'config.header.system', 'LONG', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('AuthoringActivitiesColour', 'true', 'config.authoring.activities.colour', 'config.header.look.feel', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('AuthoringClientVersion','2.3.4.@datetimestamp@', 'config.authoring.client.version', 'config.header.versions', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('MonitorClientVersion','2.3.4.@datetimestamp@', 'config.monitor.client.version', 'config.header.versions', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LearnerClientVersion','2.3.4.@datetimestamp@', 'config.learner.client.version', 'config.header.versions', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ServerVersionNumber','2.3.4.@datetimestamp@', 'config.server.version.number', 'config.header.versions', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ServerLanguage','en_AU', 'config.server.language', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('ServerPageDirection','LTR', 'config.server.page.direction', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('DictionaryDateCreated','2010-02-10', 'config.dictionary.date.created', 'config.header.versions', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('HelpURL','http://wiki.lamsfoundation.org/display/lamsdocs/', 'config.help.url', 'config.header.system', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('XmppDomain','localhost', 'config.xmpp.domain', 'config.header.chat', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('XmppConference','conference.localhost', 'config.xmpp.conference', 'config.header.chat', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('XmppAdmin','admin', 'config.xmpp.admin', 'config.header.chat', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('XmppPassword','wildfire', 'config.xmpp.password', 'config.header.chat', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('DefaultFlashTheme','default', 'config.default.flash.theme', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('DefaultHTMLTheme','defaultHTML', 'config.default.html.theme', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('AllowDirectLessonLaunch','false', 'config.allow.direct.lesson.launch', 'config.header.features', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LAMS_Community_enable','false', 'config.community.enable', 'config.header.features', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('AllowLiveEdit','true', 'config.allow.live.edit', 'config.header.features', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPProvisioningEnabled','false', 'config.ldap.provisioning.enabled', 'config.header.ldap', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPProviderURL','ldap://192.168.111.15', 'config.ldap.provider.url', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPSecurityAuthentication','simple', 'config.ldap.security.authentication', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPSearchFilter','(cn={0})', 'config.ldap.search.filter', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPBaseDN','ou=Users,dc=melcoe,dc=mq,dc=edu,dc=au', 'config.ldap.base.dn', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPBindUserDN','', 'config.ldap.bind.user.dn', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPBindUserPassword','', 'config.ldap.bind.user.password', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPSecurityProtocol','', 'config.ldap.security.protocol', 'config.header.ldap', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('TruststorePath','', 'config.ldap.truststore.path', 'config.header.system', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('TruststorePassword','', 'config.ldap.truststore.password', 'config.header.system', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPLoginAttr','uid', 'admin.user.login', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPFNameAttr','givenName', 'admin.user.first_name', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPLNameAttr','sn', 'admin.user.last_name', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPEmailAttr','mail', 'admin.user.email', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPAddr1Attr','postalAddress', 'admin.user.address_line_1', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPAddr2Attr','', 'admin.user.address_line_2', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPAddr3Attr','', 'admin.user.address_line_3', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPCityAttr','l', 'admin.user.city', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPStateAttr','st', 'admin.user.state', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPPostcodeAttr','postalCode', 'admin.user.postcode', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPCountryAttr','', 'admin.user.country', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPDayPhoneAttr','telephoneNumber', 'admin.user.day_phone', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPEveningPhoneAttr','homePhone', 'admin.user.evening_phone', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPFaxAttr','facsimileTelephoneNumber', 'admin.user.fax', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPMobileAttr','mobile', 'admin.user.mobile_phone', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPLocaleAttr','preferredLanguage', 'admin.organisation.locale', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPDisabledAttr','!accountStatus', 'sysadmin.disabled', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPOrgAttr','schoolCode', 'admin.course', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPRolesAttr','memberOf', 'admin.user.roles', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPLearnerMap','Student;SchoolSupportStaff;Teacher;SeniorStaff;Principal', 'config.ldap.learner.map', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPMonitorMap','SchoolSupportStaff;Teacher;SeniorStaff;Principal', 'config.ldap.monitor.map', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPAuthorMap','Teacher;SeniorStaff;Principal', 'config.ldap.author.map', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPGroupAdminMap','Teacher;SeniorStaff', 'config.ldap.group.admin.map', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPGroupManagerMap','Principal', 'config.ldap.group.manager.map', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPUpdateOnLogin', 'true', 'config.ldap.update.on.login', 'config.header.ldap', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPOrgField', 'code', 'config.ldap.org.field', 'config.header.ldap.attributes', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPOnlyOneOrg', 'true', 'config.ldap.only.one.org', 'config.header.ldap', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPEncryptPasswordFromBrowser', 'true', 'config.ldap.encrypt.password.from.browser', 'config.header.ldap', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LDAPSearchResultsPageSize', '100', 'config.ldap.search.results.page.size', 'config.header.ldap', 'LONG', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LearnerProgressBatchSize', '10', 'config.learner.progress.batch.size', 'config.header.look.feel', 'LONG', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('CustomTabLink','', 'config.custom.tab.link', 'config.header.look.feel', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('CustomTabTitle','', 'config.custom.tab.title', 'config.header.look.feel', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('EnableFlash','true', 'config.flash.enable', 'config.header.features', 'BOOLEAN', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('AuthoringScreenSize','1024x768', 'config.authoring.screen.size', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('MonitorScreenSize','1024x768', 'config.monitor.screen.size', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('LearnerScreenSize','1024x768', 'config.learner.screen.size', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('AdminScreenSize','1024x768', 'config.admin.screen.size', 'config.header.look.feel', 'STRING', 1); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('SMTPUser','', 'config.smtp.user', 'config.header.email', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('SMTPPassword','', 'config.smtp.password', 'config.header.email', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('Red5ServerUrl','', 'config.red5.server.url', 'config.header.red5', 'STRING', 0); + +insert into lams_configuration (config_key, config_value, description_key, header_name, format, required) +values ('Red5RecordingsUrl','', 'config.red5.recordings.url', 'config.header.red5', 'STRING', 0); Index: macosx_installer/lams_code/unix.properties =================================================================== diff -u --- macosx_installer/lams_code/unix.properties (revision 0) +++ macosx_installer/lams_code/unix.properties (revision 2f8b6c47ef1411326bfe97c5d2d991aa681f0006) @@ -0,0 +1,39 @@ +# Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) +# License Information: http://lamsfoundation.org/licensing/lams/2.0/ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2.0 +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +# USA +# +# http://www.gnu.org/licenses/gpl.txt + +# Properties needed to run master-build. +# These are OS dependent properties, configured for various flavours +# of *nix. Named unix.properties for convenience - linuxunix.properties +# would have looked odd, as does otheros.properties. + +conf=${basedir}/conf/unix +conf.jboss=${conf}/jboss + +contentrepository.directory=/var/opt/${conf.application}/repository + +#JBoss deploy directory (Unix) +jboss.home=/usr/local/lams/jboss-4.0.2/ +jboss.server=${jboss.home}server/ +jboss.server.instance=${jboss.server}default +jboss.server.instance.lib=${jboss.server.instance}/lib +jboss.ear.deploy=${jboss.server.instance}/deploy/ +jboss.deploy=${jboss.ear.deploy}/${conf.application}.ear + + +j2eelibs=${jboss.server.instance}/lib \ No newline at end of file