/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License") +  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.openmeetings.servlet.outputhandler;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.openmeetings.app.OpenmeetingsVariables;
import org.openmeetings.app.data.basic.AuthLevelmanagement;
import org.openmeetings.app.data.basic.Configurationmanagement;
import org.openmeetings.app.data.basic.Sessionmanagement;
import org.openmeetings.app.data.basic.dao.LdapConfigDaoImpl;
import org.openmeetings.app.data.calendar.daos.AppointmentDaoImpl;
import org.openmeetings.app.data.calendar.daos.MeetingMemberDaoImpl;
import org.openmeetings.app.data.conference.PollManagement;
import org.openmeetings.app.data.conference.Roommanagement;
import org.openmeetings.app.data.conference.dao.RoomModeratorsDaoImpl;
import org.openmeetings.app.data.file.dao.FileExplorerItemDaoImpl;
import org.openmeetings.app.data.flvrecord.FlvRecordingDaoImpl;
import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
import org.openmeetings.app.data.user.Organisationmanagement;
import org.openmeetings.app.data.user.Usermanagement;
import org.openmeetings.app.data.user.dao.PrivateMessageFolderDaoImpl;
import org.openmeetings.app.data.user.dao.PrivateMessagesDaoImpl;
import org.openmeetings.app.data.user.dao.UserContactsDaoImpl;
import org.openmeetings.app.data.user.dao.UsersDaoImpl;
import org.openmeetings.app.persistence.beans.basic.Configuration;
import org.openmeetings.app.persistence.beans.basic.LdapConfig;
import org.openmeetings.app.persistence.beans.calendar.Appointment;
import org.openmeetings.app.persistence.beans.calendar.MeetingMember;
import org.openmeetings.app.persistence.beans.domain.Organisation;
import org.openmeetings.app.persistence.beans.domain.Organisation_Users;
import org.openmeetings.app.persistence.beans.files.FileExplorerItem;
import org.openmeetings.app.persistence.beans.flvrecord.FlvRecording;
import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingMetaData;
import org.openmeetings.app.persistence.beans.poll.RoomPoll;
import org.openmeetings.app.persistence.beans.poll.RoomPollAnswers;
import org.openmeetings.app.persistence.beans.rooms.RoomModerators;
import org.openmeetings.app.persistence.beans.rooms.Rooms;
import org.openmeetings.app.persistence.beans.rooms.Rooms_Organisation;
import org.openmeetings.app.persistence.beans.sip.asterisk.AsteriskSipUsers;
import org.openmeetings.app.persistence.beans.sip.asterisk.Extensions;
import org.openmeetings.app.persistence.beans.sip.asterisk.MeetMe;
import org.openmeetings.app.persistence.beans.user.PrivateMessageFolder;
import org.openmeetings.app.persistence.beans.user.PrivateMessages;
import org.openmeetings.app.persistence.beans.user.UserContacts;
import org.openmeetings.app.persistence.beans.user.Users;
import org.openmeetings.app.sip.api.impl.asterisk.dao.AsteriskDAOImpl;
import org.openmeetings.utils.math.CalendarPatterns;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 
 * @author sebastianwagner
 * 
 */
public class BackupExport {

	private static final Logger log = Red5LoggerFactory.getLogger(
			BackupExport.class, OpenmeetingsVariables.webAppRootKey);
	private static final String BACKUP_COMMENT = 
			"###############################################\n"
			+ "This File is auto-generated by the Backup Tool \n"
			+ "you should use the BackupPanel to modify or change this file \n"
			+ "see http://incubator.apache.org/openmeetings/Upgrade.html for Details \n"
			+ "###############################################";

	@Autowired
	private AppointmentDaoImpl appointmentDao;
	@Autowired
	private Sessionmanagement sessionManagement;
	@Autowired
	private Usermanagement userManagement;
	@Autowired
	private Organisationmanagement organisationmanagement;
	@Autowired
	private Roommanagement roommanagement;
	@Autowired
	private FileExplorerItemDaoImpl fileExplorerItemDao;
	@Autowired
	private FlvRecordingDaoImpl flvRecordingDao;
	@Autowired
	private FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDao;
	@Autowired
	private RoomModeratorsDaoImpl roomModeratorsDao;
	@Autowired
	private UsersDaoImpl usersDao;
	@Autowired
	private MeetingMemberDaoImpl meetingMemberDao;
	@Autowired
	private LdapConfigDaoImpl ldapConfigDao;
	@Autowired
	private PrivateMessagesDaoImpl privateMessagesDao;
	@Autowired
	private PrivateMessageFolderDaoImpl privateMessageFolderDao;
	@Autowired
	private UserContactsDaoImpl userContactsDao;
	@Autowired
	private AuthLevelmanagement authLevelManagement;
	@Autowired
	private PollManagement pollManagement;
	@Autowired
	private Configurationmanagement cfgManagement;
	@Autowired
	private AsteriskDAOImpl asteriskDAOImpl;

	public void performExport(String filePath, File backup_dir,
			boolean includeFiles, String omFilesDir) throws Exception {

		if (!backup_dir.exists()) {
			backup_dir.mkdirs();
		}
		
		/*
		 * ##################### Backup Organizations
		 */
		List<Organisation> orgList = organisationmanagement
				.getOrganisations(3L);

		if (orgList != null) {
			Document doc = this.createOrgDocument(orgList);

			File orgListXML = new File(backup_dir, "organizations.xml");

			FileOutputStream fos = new FileOutputStream(orgListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Backup Users
		 */

		List<Users> uList = usersDao.getAllUsersDeleted();

		if (uList != null) {
			log.debug("Number of Users to be deleted " + uList.size());

			Document doc = this.createDocument(uList);

			File userListXML = new File(backup_dir, "users.xml");

			FileOutputStream fos = new FileOutputStream(userListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Backup Room
		 */
		List<Rooms> roomList = roommanagement.getBackupRooms();

		if (roomList != null) {
			Document doc = this.createRoomsDocument(roomList);

			File roomListXML = new File(backup_dir, "rooms.xml");

			FileOutputStream fos = new FileOutputStream(roomListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Backup Room Organizations
		 */
		List<Rooms_Organisation> roomOrgList = roommanagement
				.getRoomsOrganisations();

		if (roomOrgList != null) {
			Document doc = this.createOrgRoomsDocument(roomOrgList);

			File roomListXML = new File(backup_dir, "rooms_organisation.xml");

			FileOutputStream fos = new FileOutputStream(roomListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Backup Appointements
		 */
		List<Appointment> aList = appointmentDao.getAppointments();

		if (aList != null) {
			Document doc = this.createAppointementDocument(aList);

			File aListXML = new File(backup_dir, "appointements.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);

		}

		/*
		 * ##################### Backup Meeting Members
		 */
		List<MeetingMember> membersList = meetingMemberDao.getMeetingMembers();

		if (membersList != null) {
			Document doc = this.createMeetingMemberDocument(membersList);

			File aListXML = new File(backup_dir, "meetingmembers.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);

		}

		/*
		 * ##################### LDAP Configs
		 */
		List<LdapConfig> ldapConfigList = ldapConfigDao.getLdapConfigs();

		if (ldapConfigList != null) {
			Document doc = this.createLdapConfigDocument(ldapConfigList);

			File aListXML = new File(backup_dir, "ldapconfigs.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Private Messages
		 */
		List<PrivateMessages> privateMessages = privateMessagesDao
				.getPrivateMessages();

		if (privateMessages != null) {
			Document doc = this.createPrivateMessagesDocument(privateMessages);

			File aListXML = new File(backup_dir, "privateMessages.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Private Message Folders
		 */
		List<PrivateMessageFolder> privateMessageFolders = privateMessageFolderDao
				.getPrivateMessageFolders();

		if (privateMessageFolders != null) {
			Document doc = this
					.createPrivateMessageFolderDocument(privateMessageFolders);

			File aListXML = new File(backup_dir, "privateMessageFolder.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### User Contacts
		 */
		List<UserContacts> userContacts = userContactsDao.getUserContacts();

		if (privateMessageFolders != null) {
			Document doc = this.createUserContactsDocument(userContacts);

			File aListXML = new File(backup_dir, "userContacts.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### File-Explorer
		 */
		List<FileExplorerItem> fileExplorerList = fileExplorerItemDao
				.getFileExplorerItems();

		if (fileExplorerList != null) {
			Document doc = this
					.createFileExplorerItemDocument(fileExplorerList);

			File aListXML = new File(backup_dir, "fileExplorerItems.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Recordings
		 */
		List<FlvRecording> flvRecordings = flvRecordingDao
				.getAllFlvRecordings();

		for (FlvRecording flvRecording : flvRecordings) {
			flvRecording.setFlvRecordingMetaData(flvRecordingMetaDataDao
					.getFlvRecordingMetaDataByRecording(flvRecording
							.getFlvRecordingId()));
		}

		if (privateMessageFolders != null) {
			Document doc = this.createFlvRecordingDocument(flvRecordings);

			File aListXML = new File(backup_dir, "flvRecordings.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Polls
		 */
		List<RoomPoll> roomPolls = pollManagement.getPollListBackup();

		if (roomPolls != null) {
			Document doc = this.createRoomPollDocument(roomPolls);

			File aListXML = new File(backup_dir, "roompolls.xml");

			FileOutputStream fos = new FileOutputStream(aListXML);

			this.serializetoXML(fos, "UTF-8", doc);
		}

		/*
		 * ##################### Config
		 */
		List<Configuration> configs = cfgManagement.getConfigurations(0, Integer.MAX_VALUE, "conf_key", true);
		if (configs != null) {
			Document doc = createConfigDocument(configs);
			File aListXML = new File(backup_dir, "configs.xml");
			FileOutputStream fos = new FileOutputStream(aListXML);
			this.serializetoXML(fos, "UTF-8", doc);
		}
		
		/*
		 * ##################### Asterisk SIP Data
		 */
		List<AsteriskSipUsers> asteriskSipUsers = asteriskDAOImpl.getAsteriskSipUsers();
		if (asteriskSipUsers != null) {
			Document doc = createAsteriskSipUsersDocument(asteriskSipUsers);
			File aListXML = new File(backup_dir, "asterisksipusers.xml");
			FileOutputStream fos = new FileOutputStream(aListXML);
			this.serializetoXML(fos, "UTF-8", doc);
		}
		
		/*
		 * ##################### Asterisk SIP Extensions
		 */
		List<Extensions> extensions = asteriskDAOImpl.getExtensions();
		if (extensions != null) {
			Document doc = createExtensionsDocument(extensions);
			File aListXML = new File(backup_dir, "extensions.xml");
			FileOutputStream fos = new FileOutputStream(aListXML);
			this.serializetoXML(fos, "UTF-8", doc);
		}
		
		/*
		 * ##################### Asterisk SIP Meetme
		 */
		List<MeetMe> members = asteriskDAOImpl.getMembers();
		if (members != null) {
			Document doc = createMembersDocument(members);
			File aListXML = new File(backup_dir, "members.xml");
			FileOutputStream fos = new FileOutputStream(aListXML);
			this.serializetoXML(fos, "UTF-8", doc);
		}
		

		if (includeFiles) {
			/*
			 * ##################### Backup Room Files
			 */
			File targetDir = new File(backup_dir, "roomFiles");

			if (!targetDir.exists()) {
				targetDir.mkdir();
			}

			File sourceDir = new File(omFilesDir, OpenmeetingsVariables.UPLOAD_DIR);

			File[] files = sourceDir.listFiles();
			for (File file : files) {
				if (file.isDirectory()) {
					if (!file.getName().equals("backup")
							&& !file.getName().equals("import")) {

						targetDir = new File(backup_dir, "roomFiles" + File.separatorChar
								+ file.getName());

						log.debug("### " + file.getName());

						copyDirectory(file, targetDir);
					}
				}
			}

			/*
			 * ##################### Backup Recording Files
			 */
			File targetDirRec = new File(backup_dir, "recordingFiles");

			if (!targetDirRec.exists()) {
				targetDirRec.mkdir();
			}

			File sourceDirRec = new File(omFilesDir, OpenmeetingsVariables.STREAMS_DIR
					+ File.separatorChar + "hibernate" + File.separatorChar);

			copyDirectory(sourceDirRec, targetDirRec);
		}

		List<File> fileList = new ArrayList<File>();
		log.debug("---Getting references to all files in: "
				+ backup_dir.getCanonicalPath());
		getAllFiles(backup_dir, fileList);
		log.debug("---Creating zip file");
		writeZipFile(backup_dir, fileList, new FileOutputStream(filePath));
		log.debug("---Done");
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	public void service(HttpServletRequest httpServletRequest,
			HttpServletResponse httpServletResponse, ServletContext servletCtx)
			throws ServletException, IOException {

		String sid = httpServletRequest.getParameter("sid");
		if (sid == null) {
			sid = "default";
		}
		log.debug("sid: " + sid);

		Long users_id = sessionManagement.checkSession(sid);
		Long user_level = userManagement.getUserLevelByID(users_id);

		log.debug("users_id: " + users_id);
		log.debug("user_level: " + user_level);

		if (authLevelManagement.checkAdminLevel(user_level)) {
			// if (true) {

			String includeFileOption = httpServletRequest
					.getParameter("includeFileOption");
			boolean includeFiles = includeFileOption == null || "yes".equals(includeFileOption);

			String moduleName = httpServletRequest
					.getParameter("moduleName");
			if (moduleName == null) {
				moduleName = "moduleName";
			}
			log.debug("moduleName: " + moduleName);

			if (moduleName.equals("backup")) {

				/*
				 * ##################### Create Base Folder structure
				 */

				String current_dir = servletCtx.getRealPath("/");
				File working_dir = new File(new File(current_dir, OpenmeetingsVariables.UPLOAD_DIR), "backup");

				if (!working_dir.exists()) {
					working_dir.mkdir();
				}

				String dateString = "backup_"
						+ CalendarPatterns.getTimeForStreamId(new Date());

				File backup_dir = new File(working_dir, dateString);
				String requestedFile = dateString + ".zip";
				File backupFile = new File(backup_dir, requestedFile);

				String full_path = backupFile.getAbsolutePath();
				try {
					performExport(full_path, backup_dir, includeFiles, current_dir);

					RandomAccessFile rf = new RandomAccessFile(full_path, "r");


					httpServletResponse.reset();
					httpServletResponse.resetBuffer();
					httpServletResponse
					.setContentType("APPLICATION/OCTET-STREAM");
					httpServletResponse.setHeader("Content-Disposition",
							"attachment; filename=\"" + requestedFile + "\"");
					httpServletResponse.setHeader("Content-Length",
							"" + rf.length());

					OutputStream out = httpServletResponse.getOutputStream();

					byte[] buffer = new byte[1024];
					int readed = -1;

					while ((readed = rf.read(buffer, 0, buffer.length)) > -1) {
						out.write(buffer, 0, readed);
					}

					rf.close();

					out.flush();
					out.close();
				} catch (Exception er) {
					log.error("Error exporting: ", er);
				}

				if (backupFile.exists()) {
					// log.debug("DELETE :1: "+backupFile.getAbsolutePath());
					backupFile.delete();
				}

				deleteDirectory(backup_dir);

			}
		} else {
			log.debug("ERROR LangExport: not authorized FileDownload "
					+ (new Date()));
		}
	}

	private Document createRoomPollDocument(List<RoomPoll> roomPollList) {

		Document document = getDocument();

		Element root = document.addElement("root");

		Element roompolls = root.addElement("roompolls");

		for (RoomPoll roomPollItem : roomPollList) {

			Element roompoll = roompolls.addElement("roompoll");

			roompoll.addElement("pollname").addCDATA(
					formatString("" + roomPollItem.getPollName()));
			roompoll.addElement("pollquestion").addCDATA(
					formatString("" + roomPollItem.getPollQuestion()));
			roompoll.addElement("archived").addCDATA(
					formatString("" + roomPollItem.isArchived()));
			roompoll.addElement("created").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(roomPollItem
									.getCreated())));
			if (roomPollItem.getCreatedBy() != null) {
				roompoll.addElement("createdbyuserid").addCDATA(
						formatString(""
								+ roomPollItem.getCreatedBy().getUser_id()));
			} else {
				roompoll.addElement("createdbyuserid").addCDATA(
						formatString(""));
			}
			if (roomPollItem.getPollType() != null) {
				roompoll.addElement("polltypeid").addCDATA(
						formatString(""
								+ roomPollItem.getPollType().getPollTypesId()));
			} else {
				roompoll.addElement("polltypeid").addCDATA(formatString(""));
			}
			if (roomPollItem.getRoom() != null) {
				roompoll.addElement("roomid")
						.addCDATA(
								formatString(""
										+ roomPollItem.getRoom().getRooms_id()));
			} else {
				roompoll.addElement("roomid").addCDATA(formatString(""));
			}

			if (roomPollItem.getRoomPollAnswerList() == null) {
				continue;
			}

			Element roompollanswers = roompoll
					.addElement("roompollanswers");

			for (RoomPollAnswers roomPollAnswersItem : roomPollItem
					.getRoomPollAnswerList()) {
				
				Element roompollanswer = roompollanswers
						.addElement("roompollanswer");

				roompollanswer.addElement("pointlist").addCDATA(
						formatString("" + roomPollAnswersItem.getPointList()));
				roompollanswer.addElement("answer").addCDATA(
						formatString("" + roomPollAnswersItem.getAnswer()));
				roompollanswer.addElement("votedate").addCDATA(
						formatString(""
								+ CalendarPatterns
										.getExportDate(roomPollAnswersItem
												.getVoteDate())));
				if (roomPollAnswersItem.getVotedUser() != null){
					roompollanswer.addElement("voteduserid").addCDATA(
							formatString("" + roomPollAnswersItem.getVotedUser().getUser_id()));
				} else {
					roompollanswer.addElement("voteduserid").addCDATA(
							formatString(""));
				}

			}

		}

		return document;
	}

	public boolean deleteDirectory(File path) throws IOException {

		// log.debug("deleteDirectory :: "+path);

		if (path.exists()) {
			File[] files = path.listFiles();
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					deleteDirectory(files[i]);
				} else {
					files[i].delete();
				}
			}
		}

		// log.debug("DELETE :3: "+path.getAbsolutePath());

		return (path.delete());
	}

	public void getAllFiles(File dir, List<File> fileList) throws IOException {
		try {
			File[] files = dir.listFiles();
			for (File file : files) {
				fileList.add(file);
				if (file.isDirectory()) {
					// log.debug("directory:" + file.getCanonicalPath());
					getAllFiles(file, fileList);
				} else {
					// log.debug("     file:" + file.getCanonicalPath());
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void writeZipFile(File directoryToZip, List<File> fileList,
			FileOutputStream fos) {

		try {
			ZipOutputStream zos = new ZipOutputStream(fos);

			for (File file : fileList) {
				if (!file.isDirectory()) { // we only zip files, not directories
					addToZip(directoryToZip, file, zos);
				}
			}

			zos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void copyDirectory(File sourceLocation, File targetLocation)
			throws IOException {

		// log.debug("^^^^ "+sourceLocation.getName()+" || "+targetLocation.getName());

		if (sourceLocation.isDirectory()) {
			if (!targetLocation.exists()) {
				targetLocation.mkdir();
			}

			String[] children = sourceLocation.list();
			for (int i = 0; i < children.length; i++) {
				copyDirectory(new File(sourceLocation, children[i]), new File(
						targetLocation, children[i]));
			}
		} else {

			InputStream in = new FileInputStream(sourceLocation);
			OutputStream out = new FileOutputStream(targetLocation);

			// Copy the bits from instream to outstream
			byte[] buf = new byte[1024];
			int len;
			while ((len = in.read(buf)) > 0) {
				out.write(buf, 0, len);
			}
			in.close();
			out.close();
		}
	}

	public void addToZip(File directoryToZip, File file, ZipOutputStream zos)
			throws FileNotFoundException, IOException {

		FileInputStream fis = new FileInputStream(file);

		// we want the zipEntry's path to be a relative path that is relative
		// to the directory being zipped, so chop off the rest of the path
		String zipFilePath = file.getCanonicalPath().substring(
				directoryToZip.getCanonicalPath().length() + 1,
				file.getCanonicalPath().length());
		log.debug("Writing '" + zipFilePath + "' to zip file");
		ZipEntry zipEntry = new ZipEntry(zipFilePath);
		zos.putNextEntry(zipEntry);

		byte[] bytes = new byte[1024];
		int length;
		while ((length = fis.read(bytes)) >= 0) {
			zos.write(bytes, 0, length);
		}

		zos.closeEntry();
		fis.close();
	}

	public Document createAppointementDocument(List<Appointment> aList)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element appointments = root.addElement("appointments");

		for (Iterator<Appointment> it = aList.iterator(); it.hasNext();) {
			Appointment a = it.next();

			Element appointment = appointments.addElement("appointment");

			appointment.addElement("appointmentId").addCDATA(
					"" + a.getAppointmentId());
			appointment.addElement("appointmentName").addCDATA(
					"" + a.getAppointmentName());
			appointment.addElement("appointmentLocation").addCDATA(
					"" + a.getAppointmentLocation());
			appointment.addElement("appointmentDescription").addCDATA(
					"" + a.getAppointmentDescription());
			appointment.addElement("appointmentStarttime")
					.addCDATA(
							CalendarPatterns.getExportDate(a
									.getAppointmentStarttime()));
			appointment.addElement("appointmentEndtime").addCDATA(
					CalendarPatterns.getExportDate(a.getAppointmentEndtime()));
			if (a.getAppointmentCategory() != null) {
				appointment.addElement("categoryId").addCDATA(
						"" + a.getAppointmentCategory().getCategoryId());
			} else {
				appointment.addElement("categoryId").addCDATA("" + 0);
			}
			if (a.getUserId() != null) {
				appointment.addElement("users_id").addCDATA(
						"" + a.getUserId().getUser_id());
			} else {
				appointment.addElement("users_id").addCDATA("" + 0);
			}
			appointment.addElement("deleted").addCDATA("" + a.getDeleted());
			if (a.getRemind() != null) {
				appointment.addElement("typId").addCDATA(
						"" + a.getRemind().getTypId());
			} else {
				appointment.addElement("typId").addCDATA("" + 0);
			}
			appointment.addElement("isDaily").addCDATA("" + a.getIsDaily());
			appointment.addElement("isWeekly").addCDATA("" + a.getIsWeekly());
			appointment.addElement("isMonthly").addCDATA("" + a.getIsMonthly());
			appointment.addElement("isYearly").addCDATA("" + a.getIsYearly());
			if (a.getRoom() != null) {
				appointment.addElement("room_id").addCDATA(
						"" + a.getRoom().getRooms_id());
			} else {
				appointment.addElement("room_id").addCDATA("" + 0);
			}
			appointment.addElement("icalId").addCDATA("" + a.getIcalId());
			appointment.addElement("language_id").addCDATA(
					"" + a.getLanguage_id());
			appointment.addElement("isPasswordProtected").addCDATA(
					"" + a.getIsPasswordProtected());
			appointment.addElement("password").addCDATA("" + a.getPassword());
		}

		return document;
	}

	public Document createRoomsDocument(List<Rooms> roomList) throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element rooms = root.addElement("rooms");

		for (Iterator<Rooms> it = roomList.iterator(); it.hasNext();) {
			Rooms r = it.next();

			Element room = rooms.addElement("room");

			room.addElement("name").addCDATA("" + r.getName());
			room.addElement("rooms_id").addCDATA("" + r.getRooms_id());
			room.addElement("deleted").addCDATA("" + r.getDeleted());
			room.addElement("comment").addCDATA("" + r.getComment());
			room.addElement("numberOfPartizipants").addCDATA(
					"" + r.getNumberOfPartizipants());
			room.addElement("appointment").addCDATA("" + r.getAppointment());
			room.addElement("externalRoomId").addCDATA(
					"" + r.getExternalRoomId());
			room.addElement("externalRoomType").addCDATA(
					"" + r.getExternalRoomType());
			if (r.getRoomtype() != null) {
				room.addElement("roomtypeId").addCDATA(
						"" + r.getRoomtype().getRoomtypes_id());
			} else {
				room.addElement("roomtypeId").addCDATA("" + 0);
			}
			if (r.getOwnerId() != null) {
				room.addElement("ownerid").addCDATA("" + r.getOwnerId());
			} else {
				room.addElement("ownerid").addCDATA("");
			}
			if (r.getWaitForRecording() != null) {
				room.addElement("waitForRecording").addCDATA(
						"" + r.getWaitForRecording());
			} else {
				room.addElement("waitForRecording").addCDATA("");
			}
			if (r.getHideTopBar() != null) {
				room.addElement("hideTopBar").addCDATA("" + r.getHideTopBar());
			} else {
				room.addElement("hideTopBar").addCDATA("");
			}
			if (r.getAllowRecording() != null) {
				room.addElement("allowRecording").addCDATA(
						"" + r.getAllowRecording());
			} else {
				room.addElement("allowRecording").addCDATA("");
			}
			room.addElement("isDemoRoom").addCDATA("" + r.getIsDemoRoom());
			room.addElement("demoTime").addCDATA("" + r.getDemoTime());
			room.addElement("isModeratedRoom").addCDATA(
					"" + r.getIsModeratedRoom());
			room.addElement("allowUserQuestions").addCDATA(
					"" + r.getAllowUserQuestions());
			room.addElement("isAudioOnly").addCDATA("" + r.getIsAudioOnly());
			room.addElement("sipNumber").addCDATA("" + r.getSipNumber());
			room.addElement("conferencePin")
					.addCDATA("" + r.getConferencePin());
			if (r.getIspublic() != null) {
				room.addElement("ispublic").addCDATA("" + r.getIspublic());
			} else {
				r.setIspublic(false);
				room.addElement("ispublic").addCDATA("" + r.getIspublic());
			}
			
			if (r.getShowMicrophoneStatus() != null) {
				room.addElement("showMicrophoneStatus").addCDATA("" + r.getShowMicrophoneStatus());
			} else {
				r.setShowMicrophoneStatus(false);
				room.addElement("showMicrophoneStatus").addCDATA("" + r.getShowMicrophoneStatus());
			}
			
			if (r.getHideActionsMenu() != null) {
				room.addElement("hideActionsMenu").addCDATA("" + r.getHideActionsMenu());
			} else {
				room.addElement("hideActionsMenu").addCDATA("");
			}
			
			if (r.getHideActivitiesAndActions() != null) {
				room.addElement("hideActivitiesAndActions").addCDATA("" + r.getHideActivitiesAndActions());
			} else {
				room.addElement("hideActivitiesAndActions").addCDATA("");
			}
			
			if (r.getHideChat() != null) {
				room.addElement("hideChat").addCDATA("" + r.getHideChat());
			} else {
				room.addElement("hideChat").addCDATA("");
			}
			
			if (r.getHideFilesExplorer() != null) {
				room.addElement("hideFilesExplorer").addCDATA("" + r.getHideFilesExplorer());
			} else {
				room.addElement("hideFilesExplorer").addCDATA("");
			}
			
			if (r.getHideScreenSharing() != null) {
				room.addElement("hideScreenSharing").addCDATA("" + r.getHideScreenSharing());
			} else {
				room.addElement("hideScreenSharing").addCDATA("");
			}
			
			if (r.getHideWhiteboard() != null) {
				room.addElement("hideWhiteboard").addCDATA("" + r.getHideWhiteboard());
			} else {
				room.addElement("hideWhiteboard").addCDATA("");
			}

			room.addElement("isClosed").addCDATA("" + r.getIsClosed());
			room.addElement("redirectURL").addCDATA("" + r.getRedirectURL());

			List<RoomModerators> roomModeratorsList = roomModeratorsDao
					.getRoomModeratorByRoomId(r.getRooms_id());

			Element room_moderators = room.addElement("room_moderators");

			for (RoomModerators roomModerator : roomModeratorsList) {

				Element room_moderator = room_moderators
						.addElement("room_moderator");

				if (roomModerator.getUser() != null) {
					room_moderator.addElement("user_id").addCDATA(
							"" + roomModerator.getUser().getUser_id());
				} else {
					room_moderator.addElement("user_id").addCDATA("0");
				}

				room_moderator.addElement("is_supermoderator").addCDATA(
						"" + roomModerator.getIsSuperModerator());
			}

		}

		return document;
	}

	public Document createOrgDocument(List<Organisation> orgList)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element organisations = root.addElement("organisations");

		for (Iterator<Organisation> it = orgList.iterator(); it.hasNext();) {
			Organisation org = it.next();

			Element organisation = organisations.addElement("organisation");

			organisation.addElement("name").addCDATA(
					formatString("" + org.getName()));
			organisation.addElement("organisation_id").addCDATA(
					formatString("" + org.getOrganisation_id()));
			organisation.addElement("deleted").addCDATA(
					formatString("" + org.getDeleted()));

		}

		return document;
	}

	private String formatString(String str) {
		// Todo fix if there is sth. we can do to prevent unicode replacement
		// with invalid chars
		// This is the place if you need to do special conversion on the strings
		return str;
	}

	private Document createPrivateMessagesDocument(
			List<PrivateMessages> privateMessages) throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element privatemessages = root.addElement("privatemessages");

		for (Iterator<PrivateMessages> it = privateMessages.iterator(); it
				.hasNext();) {
			PrivateMessages pm = it.next();

			Element privateMessage = privatemessages
					.addElement("privatemessage");

			privateMessage.addElement("privateMessageId").addCDATA(
					formatString("" + pm.getPrivateMessageId()));
			privateMessage.addElement("message").addCDATA(
					formatString("" + pm.getMessage()));
			privateMessage.addElement("subject").addCDATA(
					formatString("" + pm.getSubject()));
			privateMessage.addElement("privateMessageFolderId").addCDATA(
					formatString("" + pm.getPrivateMessageFolderId()));
			privateMessage.addElement("userContactId").addCDATA(
					formatString("" + pm.getUserContactId()));
			privateMessage.addElement("parentMessage").addCDATA(
					formatString("" + pm.getParentMessage()));
			privateMessage.addElement("bookedRoom").addCDATA(
					formatString("" + pm.getBookedRoom()));
			if (pm.getFrom() != null) {
				privateMessage.addElement("from").addCDATA(
						formatString("" + pm.getFrom().getUser_id()));
			} else {
				privateMessage.addElement("from").addCDATA("0");
			}
			if (pm.getTo() != null) {
				privateMessage.addElement("to").addCDATA(
						formatString("" + pm.getTo().getUser_id()));
			} else {
				privateMessage.addElement("to").addCDATA("0");
			}
			privateMessage.addElement("inserted")
					.addCDATA(
							formatString(""
									+ CalendarPatterns.getExportDate(pm
											.getInserted())));
			privateMessage.addElement("isContactRequest").addCDATA(
					formatString("" + pm.getIsContactRequest()));
			privateMessage.addElement("isRead").addCDATA(
					formatString("" + pm.getIsRead()));
			privateMessage.addElement("isTrash").addCDATA(
					formatString("" + pm.getIsTrash()));
			if (pm.getOwner() != null) {
				privateMessage.addElement("owner").addCDATA(
						formatString("" + pm.getOwner().getUser_id()));
			} else {
				privateMessage.addElement("owner").addCDATA("0");
			}

			if (pm.getRoom() != null) {
				privateMessage.addElement("room").addCDATA(
						formatString("" + pm.getRoom().getRooms_id()));
			} else {
				privateMessage.addElement("room").addCDATA("0");
			}

		}

		return document;
	}

	private Document createFileExplorerItemDocument(
			List<FileExplorerItem> fileExplorerItems) throws Exception {

		Document document = getDocument();

		Element root = document.addElement("root");

		Element fileExplorerItemsElement = root.addElement("fileExplorerItems");

		for (Iterator<FileExplorerItem> it = fileExplorerItems.iterator(); it
				.hasNext();) {
			FileExplorerItem fileExplorerItem = it.next();

			Element fileExplorerItemElement = fileExplorerItemsElement
					.addElement("fileExplorerItem");

			fileExplorerItemElement
					.addElement("fileExplorerItemId")
					.addCDATA(
							formatString(""
									+ fileExplorerItem.getFileExplorerItemId()));
			fileExplorerItemElement.addElement("fileName").addCDATA(
					formatString("" + fileExplorerItem.getFileName()));
			fileExplorerItemElement.addElement("fileHash").addCDATA(
					formatString("" + fileExplorerItem.getFileHash()));
			fileExplorerItemElement.addElement("parentFileExplorerItemId")
					.addCDATA(
							formatString(""
									+ fileExplorerItem
											.getParentFileExplorerItemId()));
			fileExplorerItemElement.addElement("room_id").addCDATA(
					formatString("" + fileExplorerItem.getRoom_id()));
			fileExplorerItemElement.addElement("ownerId").addCDATA(
					formatString("" + fileExplorerItem.getOwnerId()));
			fileExplorerItemElement.addElement("isFolder").addCDATA(
					formatString("" + fileExplorerItem.getIsFolder()));
			fileExplorerItemElement.addElement("isImage").addCDATA(
					formatString("" + fileExplorerItem.getIsImage()));
			fileExplorerItemElement.addElement("isPresentation").addCDATA(
					formatString("" + fileExplorerItem.getIsPresentation()));
			fileExplorerItemElement.addElement("isVideo").addCDATA(
					formatString("" + fileExplorerItem.getIsVideo()));
			fileExplorerItemElement.addElement("insertedBy").addCDATA(
					formatString("" + fileExplorerItem.getInsertedBy()));
			fileExplorerItemElement.addElement("inserted").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(fileExplorerItem
									.getInserted())));
			fileExplorerItemElement.addElement("updated").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(fileExplorerItem
									.getUpdated())));
			fileExplorerItemElement.addElement("deleted").addCDATA(
					formatString("" + fileExplorerItem.getDeleted()));
			fileExplorerItemElement.addElement("fileSize").addCDATA(
					formatString("" + fileExplorerItem.getFileSize()));
			fileExplorerItemElement.addElement("flvWidth").addCDATA(
					formatString("" + fileExplorerItem.getFlvWidth()));
			fileExplorerItemElement.addElement("flvHeight").addCDATA(
					formatString("" + fileExplorerItem.getFlvHeight()));
			fileExplorerItemElement.addElement("previewImage").addCDATA(
					formatString("" + fileExplorerItem.getPreviewImage()));
			fileExplorerItemElement.addElement("wmlFilePath").addCDATA(
					formatString("" + fileExplorerItem.getWmlFilePath()));
			fileExplorerItemElement.addElement("isStoredWmlFile").addCDATA(
					formatString("" + fileExplorerItem.getIsStoredWmlFile()));
			fileExplorerItemElement.addElement("isChart").addCDATA(
					formatString("" + fileExplorerItem.getIsChart()));

		}

		return document;

	}

	private Document createFlvRecordingDocument(List<FlvRecording> flvRecordings)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element flvrecordings = root.addElement("flvrecordings");

		for (Iterator<FlvRecording> it = flvRecordings.iterator(); it.hasNext();) {
			FlvRecording flvRec = it.next();

			Element flvrecording = flvrecordings.addElement("flvrecording");

			flvrecording.addElement("alternateDownload").addCDATA(
					formatString("" + flvRec.getAlternateDownload()));
			flvrecording.addElement("comment").addCDATA(
					formatString("" + flvRec.getComment()));
			flvrecording.addElement("deleted").addCDATA(
					formatString("" + flvRec.getDeleted()));
			flvrecording.addElement("fileHash").addCDATA(
					formatString("" + flvRec.getFileHash()));
			flvrecording.addElement("fileName").addCDATA(
					formatString("" + flvRec.getFileName()));
			flvrecording.addElement("flvRecordingId").addCDATA(
					formatString("" + flvRec.getFlvRecordingId()));
			flvrecording.addElement("previewImage").addCDATA(
					formatString("" + flvRec.getPreviewImage()));
			flvrecording.addElement("recorderStreamId").addCDATA(
					formatString("" + flvRec.getRecorderStreamId()));
			flvrecording.addElement("fileSize").addCDATA(
					formatString("" + flvRec.getFileSize()));
			flvrecording.addElement("flvHeight").addCDATA(
					formatString("" + flvRec.getFlvHeight()));
			flvrecording.addElement("flvWidth").addCDATA(
					formatString("" + flvRec.getFlvWidth()));
			flvrecording.addElement("height").addCDATA(
					formatString("" + flvRec.getHeight()));
			flvrecording.addElement("width").addCDATA(
					formatString("" + flvRec.getWidth()));
			flvrecording.addElement("insertedBy").addCDATA(
					formatString("" + flvRec.getInsertedBy()));
			flvrecording.addElement("organization_id").addCDATA(
					formatString("" + flvRec.getOrganization_id()));
			flvrecording.addElement("ownerId").addCDATA(
					formatString("" + flvRec.getOwnerId()));
			flvrecording.addElement("parentFileExplorerItemId").addCDATA(
					formatString("" + flvRec.getParentFileExplorerItemId()));
			flvrecording.addElement("progressPostProcessing").addCDATA(
					formatString("" + flvRec.getProgressPostProcessing()));
			flvrecording.addElement("room_id").addCDATA(
					formatString("" + flvRec.getRoom_id()));
			flvrecording.addElement("inserted").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(flvRec
									.getInserted())));
			flvrecording.addElement("isFolder").addCDATA(
					formatString("" + flvRec.getIsFolder()));
			flvrecording.addElement("isImage").addCDATA(
					formatString("" + flvRec.getIsImage()));
			flvrecording.addElement("isInterview").addCDATA(
					formatString("" + flvRec.getIsInterview()));
			flvrecording.addElement("isPresentation").addCDATA(
					formatString("" + flvRec.getIsPresentation()));
			flvrecording.addElement("isRecording").addCDATA(
					formatString("" + flvRec.getIsRecording()));
			flvrecording.addElement("recordEnd").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(flvRec
									.getRecordEnd())));
			flvrecording.addElement("recordStart").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(flvRec
									.getRecordStart())));

			Element flvrecordingmetadatas = flvrecording
					.addElement("flvrecordingmetadatas");

			for (Iterator<FlvRecordingMetaData> itMeta = flvRec
					.getFlvRecordingMetaData().iterator(); itMeta.hasNext();) {
				FlvRecordingMetaData flvMeta = itMeta.next();

				Element flvrecordingmetadata = flvrecordingmetadatas
						.addElement("flvrecordingmetadata");

				flvrecordingmetadata.addElement("flvRecordingMetaDataId")
						.addCDATA(
								formatString(""
										+ flvMeta.getFlvRecordingMetaDataId()));
				flvrecordingmetadata.addElement("freeTextUserName").addCDATA(
						formatString("" + flvMeta.getFreeTextUserName()));
				flvrecordingmetadata.addElement("fullWavAudioData").addCDATA(
						formatString("" + flvMeta.getFullWavAudioData()));
				flvrecordingmetadata.addElement("streamName").addCDATA(
						formatString("" + flvMeta.getStreamName()));
				flvrecordingmetadata.addElement("wavAudioData").addCDATA(
						formatString("" + flvMeta.getWavAudioData()));
				flvrecordingmetadata.addElement("initialGapSeconds").addCDATA(
						formatString("" + flvMeta.getInitialGapSeconds()));
				flvrecordingmetadata.addElement("insertedBy").addCDATA(
						formatString("" + flvMeta.getInsertedBy()));
				flvrecordingmetadata.addElement("interiewPodId").addCDATA(
						formatString("" + flvMeta.getInteriewPodId()));
				flvrecordingmetadata.addElement("audioIsValid").addCDATA(
						formatString("" + flvMeta.getAudioIsValid()));
				flvrecordingmetadata.addElement("inserted").addCDATA(
						formatString(""
								+ CalendarPatterns.getExportDate(flvMeta
										.getInserted())));
				flvrecordingmetadata.addElement("isAudioOnly").addCDATA(
						formatString("" + flvMeta.getIsAudioOnly()));
				flvrecordingmetadata.addElement("isScreenData").addCDATA(
						formatString("" + flvMeta.getIsScreenData()));
				flvrecordingmetadata.addElement("isVideoOnly").addCDATA(
						formatString("" + flvMeta.getIsVideoOnly()));
				flvrecordingmetadata.addElement("recordEnd").addCDATA(
						formatString(""
								+ CalendarPatterns.getExportDate(flvMeta
										.getRecordEnd())));
				flvrecordingmetadata.addElement("recordStart").addCDATA(
						formatString(""
								+ CalendarPatterns.getExportDate(flvMeta
										.getRecordStart())));
				flvrecordingmetadata.addElement("updated").addCDATA(
						formatString(""
								+ CalendarPatterns.getExportDate(flvMeta
										.getUpdated())));

			}

		}

		return document;
	}

	private Document createPrivateMessageFolderDocument(
			List<PrivateMessageFolder> privateMessageFolders) throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element privatemessagefolders = root
				.addElement("privatemessagefolders");

		for (Iterator<PrivateMessageFolder> it = privateMessageFolders
				.iterator(); it.hasNext();) {
			PrivateMessageFolder pmf = it.next();

			Element privateMessageFolder = privatemessagefolders
					.addElement("privatemessagefolder");

			privateMessageFolder.addElement("privateMessageFolderId").addCDATA(
					formatString("" + pmf.getPrivateMessageFolderId()));
			privateMessageFolder.addElement("folderName").addCDATA(
					formatString("" + pmf.getFolderName()));
			privateMessageFolder.addElement("userId").addCDATA(
					formatString("" + pmf.getUserId()));

		}

		return document;
	}

	private Document createUserContactsDocument(List<UserContacts> userContacts)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element usercontacts = root.addElement("usercontacts");

		for (Iterator<UserContacts> it = userContacts.iterator(); it.hasNext();) {
			UserContacts uc = it.next();

			Element usercontact = usercontacts.addElement("usercontact");

			usercontact.addElement("userContactId").addCDATA(
					formatString("" + uc.getUserContactId()));
			usercontact.addElement("hash").addCDATA(
					formatString("" + uc.getHash()));
			if (uc.getContact() != null) {
				usercontact.addElement("contact").addCDATA(
						formatString("" + uc.getContact().getUser_id()));
			} else {
				usercontact.addElement("contact").addCDATA("0");
			}
			if (uc.getOwner() != null) {
				usercontact.addElement("owner").addCDATA(
						formatString("" + uc.getOwner().getUser_id()));
			} else {
				usercontact.addElement("owner").addCDATA("0");
			}
			usercontact.addElement("pending").addCDATA(
					formatString("" + uc.getPending()));
			usercontact.addElement("shareCalendar").addCDATA(
					formatString("" + uc.getShareCalendar()));

		}

		return document;
	}

	private Document createOrgRoomsDocument(List<Rooms_Organisation> roomOrgList)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element organisations = root.addElement("room_organisations");

		for (Iterator<Rooms_Organisation> it = roomOrgList.iterator(); it
				.hasNext();) {
			Rooms_Organisation roomOrg = it.next();

			Element room_organisation = organisations
					.addElement("room_organisation");

			room_organisation.addElement("rooms_organisation_id").addCDATA(
					formatString("" + roomOrg.getRooms_organisation_id()));
			room_organisation.addElement("organisation_id").addCDATA(
				"true".equals(roomOrg.getDeleted()) ? "0" :
				formatString(""
						+ roomOrg.getOrganisation().getOrganisation_id()));
			if (roomOrg.getRoom() != null) {
				room_organisation.addElement("rooms_id").addCDATA(
						formatString("" + roomOrg.getRoom().getRooms_id()));
			} else {
				room_organisation.addElement("rooms_id").addCDATA("0");
			}
			room_organisation.addElement("deleted").addCDATA(
					formatString("" + roomOrg.getDeleted()));

		}

		return document;
	}

	private Document createMeetingMemberDocument(List<MeetingMember> memberList)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element meetingmembers = root.addElement("meetingmembers");

		for (Iterator<MeetingMember> it = memberList.iterator(); it.hasNext();) {
			MeetingMember meetMember = it.next();

			Element meetingmember = meetingmembers.addElement("meetingmember");

			meetingmember.addElement("meetingMemberId").addCDATA(
					formatString("" + meetMember.getMeetingMemberId()));
			if (meetMember.getUserid() != null) {
				meetingmember.addElement("userid").addCDATA(
						formatString("" + meetMember.getUserid().getUser_id()));
			} else {
				meetingmember.addElement("userid").addCDATA("0");
			}
			if (meetMember.getAppointment() != null) {
				meetingmember.addElement("appointment").addCDATA(
						formatString(""
								+ meetMember.getAppointment()
										.getAppointmentId()));
			} else {
				meetingmember.addElement("appointment").addCDATA("0");
			}
			meetingmember.addElement("firstname").addCDATA(
					formatString("" + meetMember.getFirstname()));
			meetingmember.addElement("lastname").addCDATA(
					formatString("" + meetMember.getLastname()));
			meetingmember.addElement("memberStatus").addCDATA(
					formatString("" + meetMember.getMemberStatus()));
			meetingmember.addElement("appointmentStatus").addCDATA(
					formatString("" + meetMember.getAppointmentStatus()));
			meetingmember.addElement("email").addCDATA(
					formatString("" + meetMember.getEmail()));
			meetingmember.addElement("deleted").addCDATA(
					formatString("" + meetMember.getDeleted()));
			meetingmember.addElement("invitor").addCDATA(
					formatString("" + meetMember.getInvitor()));

		}

		return document;
	}

	private Document createLdapConfigDocument(List<LdapConfig> ldapConfigList)
			throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element ldapconfigs = root.addElement("ldapconfigs");

		for (Iterator<LdapConfig> it = ldapConfigList.iterator(); it.hasNext();) {

			LdapConfig ldapC = it.next();

			Element ldapconfig = ldapconfigs.addElement("ldapconfig");

			ldapconfig.addElement("name").addCDATA(
					formatString("" + ldapC.getName()));
			ldapconfig.addElement("configFileName").addCDATA(
					formatString("" + ldapC.getConfigFileName()));
			ldapconfig.addElement("addDomainToUserName").addCDATA(
					formatString("" + ldapC.getAddDomainToUserName()));
			ldapconfig.addElement("domain").addCDATA(
					formatString("" + ldapC.getDomain()));
			ldapconfig.addElement("isActive").addCDATA(
					formatString("" + ldapC.getIsActive()));

		}

		return document;
	}

	public Document createDocument(List<Users> uList) throws Exception {
		Document document = getDocument();

		Element root = document.addElement("root");

		Element users = root.addElement("users");

		for (Users u : uList) {
			Element user = users.addElement("user");

			user.addElement("user_id").addCDATA(
					formatString("" + u.getUser_id()));
			user.addElement("deleted").addCDATA(
					formatString("" + u.getDeleted()));
			user.addElement("age")
					.addCDATA(
							formatString(""
									+ CalendarPatterns.getDateByMiliSeconds(u
											.getAge())));
			if (u.getAvailible() != null) {
				user.addElement("availible").addCDATA(
						formatString("" + u.getAvailible().toString()));
			} else {
				user.addElement("availible").addCDATA("0");
			}
			user.addElement("deleted").addCDATA(
					formatString("" + u.getDeleted()));
			user.addElement("firstname").addCDATA(
					formatString("" + u.getFirstname()));
			user.addElement("lastname").addCDATA(
					formatString("" + u.getLastname()));
			user.addElement("login").addCDATA(formatString("" + u.getLogin()));
			user.addElement("pass")
					.addCDATA(formatString("" + u.getPassword()));

			if (u.getActivatehash() != null) {
				user.addElement("activatehash").addCDATA(
						formatString("" + u.getActivatehash()));
			} else {
				user.addElement("activatehash").addCDATA(formatString(""));
			}
			if (u.getExternalUserType() != null) {
				user.addElement("externalUserType").addCDATA(
						formatString("" + u.getExternalUserType()));
			} else {
				user.addElement("externalUserType").addCDATA(formatString(""));
			}

			if (u.getExternalUserId() != null) {
				user.addElement("externalUserId").addCDATA(
						formatString("" + u.getExternalUserId()));
			} else {
				user.addElement("externalUserId").addCDATA(formatString(""));
			}

			if (u.getResethash() != null) {
				user.addElement("resethash").addCDATA(
						formatString("" + u.getResethash()));
			} else {
				user.addElement("resethash").addCDATA(formatString(""));
			}

			if (u.getUserOffers() != null) {
				user.addElement("userOffers").addCDATA(
						formatString("" + u.getUserOffers()));
			} else {
				user.addElement("userOffers").addCDATA(formatString(""));
			}

			if (u.getUserSearchs() != null) {
				user.addElement("userSearchs").addCDATA(
						formatString("" + u.getUserSearchs()));
			} else {
				user.addElement("userSearchs").addCDATA(formatString(""));
			}

			if (u.getForceTimeZoneCheck() != null) {
				user.addElement("forceTimeZoneCheck").addCDATA(
						formatString("" + u.getForceTimeZoneCheck()));
			} else {
				user.addElement("ForceTimeZoneCheck")
						.addCDATA(formatString(""));
			}

			if (u.getLasttrans() != null) {
				user.addElement("lasttrans").addCDATA(
						formatString("" + u.getLasttrans()));
			} else {
				user.addElement("lasttrans").addCDATA(formatString(""));
			}

			if (u.getShowContactData() != null) {
				user.addElement("showContactData").addCDATA(
						formatString("" + u.getShowContactData()));
			} else {
				user.addElement("showContactData").addCDATA(formatString(""));
			}

			if (u.getShowContactDataToContacts() != null) {
				user.addElement("showContactDataToContacts").addCDATA(
						formatString("" + u.getShowContactDataToContacts()));
			} else {
				user.addElement("showContactDataToContacts").addCDATA(
						formatString(""));
			}

			String pictureuri = u.getPictureuri();
			if (pictureuri != null)
				user.addElement("pictureuri").addCDATA(pictureuri);
			else
				user.addElement("pictureuri").addCDATA(formatString(""));

			if (u.getLanguage_id() != null)
				user.addElement("language_id").addCDATA(
						formatString(u.getLanguage_id().toString()));
			else
				user.addElement("language_id").addCDATA(formatString(""));

			if (u.getStatus() != null) {
				user.addElement("status").addCDATA(
						formatString("" + u.getStatus().toString()));
			} else {
				user.addElement("status").addCDATA("0");
			}
			user.addElement("regdate").addCDATA(
					formatString(""
							+ CalendarPatterns.getExportDate(u.getRegdate())));

			if (u.getTitle_id() != null) {
				user.addElement("title_id").addCDATA(
						formatString("" + u.getTitle_id().toString()));
				user.addElement("level_id").addCDATA(
						formatString("" + u.getLevel_id().toString()));
			} else {
				user.addElement("title_id").addCDATA("1");
				user.addElement("level_id").addCDATA("1");
			}

			if (u.getOmTimeZone() != null) {
				user.addElement("omTimeZone").addCDATA(
						formatString("" + u.getOmTimeZone().getJname()));
			} else {
				user.addElement("omTimeZone").addCDATA(formatString(""));
			}

			if (u.getAdresses() != null) {
				user.addElement("additionalname").addCDATA(
						formatString("" + u.getAdresses().getAdditionalname()));
				user.addElement("comment").addCDATA(
						formatString("" + u.getAdresses().getComment()));
				// A User can not have a deleted Adress, you cannot delete the
				// Adress of an User
				// String deleted = u.getAdresses().getDeleted()
				// Phone Number not done yet
				user.addElement("fax").addCDATA(
						formatString("" + u.getAdresses().getFax()));
				if (u.getAdresses().getStates() != null) {
					user.addElement("state_id").addCDATA(
							formatString(""
									+ u.getAdresses().getStates().getState_id()
											.toString()));
				} else {
					user.addElement("state_id").addCDATA("1");
				}
				user.addElement("street").addCDATA(
						formatString("" + u.getAdresses().getStreet()));
				user.addElement("town").addCDATA(
						formatString("" + u.getAdresses().getTown()));
				user.addElement("zip").addCDATA(
						formatString("" + u.getAdresses().getZip()));

				// Email and Phone
				user.addElement("mail").addCDATA(
						formatString("" + u.getAdresses().getEmail()));
				user.addElement("phone").addCDATA(
						formatString("" + u.getAdresses().getPhone()));
			} else {
				user.addElement("additionalname").addCDATA(formatString(""));
				user.addElement("comment").addCDATA(formatString(""));
				// A User can not have a deleted address, you cannot delete the
				// address of an User without deleting the user
				// only SOAP users might have a null
				// String deleted = u.getAdresses().getDeleted()
				// Phone Number not done yet
				user.addElement("fax").addCDATA(formatString(""));
				user.addElement("state_id").addCDATA("1");
				user.addElement("street").addCDATA(formatString(""));
				user.addElement("town").addCDATA(formatString(""));
				user.addElement("zip").addCDATA(formatString(""));
				user.addElement("mail").addCDATA(formatString(""));
				user.addElement("phone").addCDATA(formatString(""));

			}

			if (u.getUserSipData() != null) {
				user.addElement("sip_username").addCDATA(
						formatString("" + u.getUserSipData().getUsername()));
				user.addElement("sip_userpass").addCDATA(
						formatString("" + u.getUserSipData().getUserpass()));
				user.addElement("sip_authid").addCDATA(
						formatString("" + u.getUserSipData().getAuthId()));
			}

			Element user_organisations = user.addElement("organisations");
			// List<String> organisations = new LinkedList();
			for (Iterator<Organisation_Users> iterObj = u
					.getOrganisation_users().iterator(); iterObj.hasNext();) {

				Element user_organisation = user_organisations
						.addElement("user_organisation");

				Organisation_Users orgUsers = iterObj.next();
				if (orgUsers.getOrganisation() != null) {
					user_organisation.addElement("organisation_id").addCDATA(
							formatString(""
									+ orgUsers.getOrganisation()
											.getOrganisation_id().toString()));
				} else {
					user_organisation.addElement("organisation_id").addCDATA(
							"0");
				}

				user_organisation.addElement("deleted").addCDATA(
						formatString("" + orgUsers.getDeleted()));
				user_organisation.addElement("isModerator").addCDATA(
						formatString("" + orgUsers.getIsModerator()));

			}

			// Not need at the moment
			// Element user_groups = user.addElement("groups");

		}

		return document;
	}

	private Document getDocument() {
		Document document = DocumentHelper.createDocument();
		document.setXMLEncoding("UTF-8");
		document.addComment(BACKUP_COMMENT);
		
		return document;
	}
	
	private Document createConfigDocument(List<Configuration> configs) {
		Document document = getDocument();
		Element root = document.addElement("root");
		Element configsElem = root.addElement("configs");
		
		for (Configuration cfg : configs) {
			Element cfgElem = configsElem.addElement("config");
			cfgElem.addElement("id").addCDATA(formatString("" + cfg.getConfiguration_id()));
			cfgElem.addElement("comment").addCDATA(formatString("" + cfg.getComment()));
			cfgElem.addElement("key").addCDATA(formatString(cfg.getConf_key()));
			cfgElem.addElement("value").addCDATA(formatString(cfg.getConf_value()));
			cfgElem.addElement("deleted").addCDATA(formatString(cfg.getDeleted()));
			cfgElem.addElement("created").addCDATA(formatString(CalendarPatterns.getExportDate(cfg.getStarttime())));
			cfgElem.addElement("updated").addCDATA(formatString(CalendarPatterns.getExportDate(cfg.getUpdatetime())));
			cfgElem.addElement("user_id").addCDATA(formatString("" + cfg.getUser_id()));
		}
		return document;
	}
	
	private Document createAsteriskSipUsersDocument(
			List<AsteriskSipUsers> asteriskSipUsers) {
		
		Document document = getDocument();
		Element root = document.addElement("root");
		Element astusersElem = root.addElement("asterisksipusers");
		
		for (AsteriskSipUsers asteriskSipUser : asteriskSipUsers) {
			Element astuserElem = astusersElem.addElement("asterisksipuser");
			astuserElem.addElement("id").addCDATA(formatString("" + asteriskSipUser.getId()));
			astuserElem.addElement("accountcode").addCDATA(formatString("" + asteriskSipUser.getAccountcode()));
			astuserElem.addElement("disallow").addCDATA(formatString("" + asteriskSipUser.getDisallow()));
			astuserElem.addElement("allow").addCDATA(formatString("" + asteriskSipUser.getAllow()));
			astuserElem.addElement("allowoverlap").addCDATA(formatString("" + asteriskSipUser.getAllowoverlap()));
			astuserElem.addElement("allowsubscribe").addCDATA(formatString("" + asteriskSipUser.getAllowsubscribe()));
			astuserElem.addElement("allowtransfer").addCDATA(formatString("" + asteriskSipUser.getAllowtransfer()));
			astuserElem.addElement("amaflags").addCDATA(formatString("" + asteriskSipUser.getAmaflags()));
			astuserElem.addElement("autoframing").addCDATA(formatString("" + asteriskSipUser.getAutoframing()));
			astuserElem.addElement("auth").addCDATA(formatString("" + asteriskSipUser.getAuth()));
			astuserElem.addElement("buggymwi").addCDATA(formatString("" + asteriskSipUser.getBuggymwi()));
			astuserElem.addElement("callgroup").addCDATA(formatString("" + asteriskSipUser.getCallgroup()));
			astuserElem.addElement("callerid").addCDATA(formatString("" + asteriskSipUser.getCallerid()));
			astuserElem.addElement("cid_number").addCDATA(formatString("" + asteriskSipUser.getCid_number()));
			astuserElem.addElement("fullname").addCDATA(formatString("" + asteriskSipUser.getFullname()));
			astuserElem.addElement("callingpres").addCDATA(formatString("" + asteriskSipUser.getCallingpres()));
			astuserElem.addElement("canreinvite").addCDATA(formatString("" + asteriskSipUser.getCanreinvite()));
			astuserElem.addElement("context").addCDATA(formatString("" + asteriskSipUser.getContext()));
			astuserElem.addElement("defaultip").addCDATA(formatString("" + asteriskSipUser.getDefaultip()));
			astuserElem.addElement("dtmfmode").addCDATA(formatString("" + asteriskSipUser.getDtmfmode()));
			astuserElem.addElement("fromuser").addCDATA(formatString("" + asteriskSipUser.getFromuser()));
			astuserElem.addElement("fromdomain").addCDATA(formatString("" + asteriskSipUser.getFromdomain()));
			astuserElem.addElement("fullcontact").addCDATA(formatString("" + asteriskSipUser.getFullcontact()));
			astuserElem.addElement("g726nonstandard").addCDATA(formatString("" + asteriskSipUser.getG726nonstandard()));
			astuserElem.addElement("host").addCDATA(formatString("" + asteriskSipUser.getHost()));
			astuserElem.addElement("insecure").addCDATA(formatString("" + asteriskSipUser.getInsecure()));
			astuserElem.addElement("ipaddr").addCDATA(formatString("" + asteriskSipUser.getIpaddr()));
			astuserElem.addElement("language").addCDATA(formatString("" + asteriskSipUser.getLanguage()));
			astuserElem.addElement("lastms").addCDATA(formatString("" + asteriskSipUser.getLastms()));
			astuserElem.addElement("mailbox").addCDATA(formatString("" + asteriskSipUser.getMailbox()));
			astuserElem.addElement("maxcallbitrate").addCDATA(formatString("" + asteriskSipUser.getMaxcallbitrate()));
			astuserElem.addElement("mohsuggest").addCDATA(formatString("" + asteriskSipUser.getMohsuggest()));
			astuserElem.addElement("md5secret").addCDATA(formatString("" + asteriskSipUser.getMd5secret()));
			astuserElem.addElement("musiconhold").addCDATA(formatString("" + asteriskSipUser.getMusiconhold()));
			astuserElem.addElement("name").addCDATA(formatString("" + asteriskSipUser.getName()));
			astuserElem.addElement("nat").addCDATA(formatString("" + asteriskSipUser.getNat()));
			astuserElem.addElement("outboundproxy").addCDATA(formatString("" + asteriskSipUser.getOutboundproxy()));
			astuserElem.addElement("deny").addCDATA(formatString("" + asteriskSipUser.getDeny()));
			astuserElem.addElement("permit").addCDATA(formatString("" + asteriskSipUser.getPermit()));
			astuserElem.addElement("pickupgroup").addCDATA(formatString("" + asteriskSipUser.getPickupgroup()));
			astuserElem.addElement("port").addCDATA(formatString("" + asteriskSipUser.getPort()));
			astuserElem.addElement("progressinband").addCDATA(formatString("" + asteriskSipUser.getProgressinband()));
			astuserElem.addElement("promiscredir").addCDATA(formatString("" + asteriskSipUser.getPromiscredir()));
			astuserElem.addElement("qualify").addCDATA(formatString("" + asteriskSipUser.getQualify()));
			astuserElem.addElement("regexten").addCDATA(formatString("" + asteriskSipUser.getRegexten()));
			astuserElem.addElement("regseconds").addCDATA(formatString("" + asteriskSipUser.getRegseconds()));
			astuserElem.addElement("rfc2833compensate").addCDATA(formatString("" + asteriskSipUser.getRfc2833compensate()));
			astuserElem.addElement("rtptimeout").addCDATA(formatString("" + asteriskSipUser.getRtptimeout()));
			astuserElem.addElement("rtpholdtimeout").addCDATA(formatString("" + asteriskSipUser.getRtpholdtimeout()));
			astuserElem.addElement("secret").addCDATA(formatString("" + asteriskSipUser.getSecret()));
			astuserElem.addElement("sendrpid").addCDATA(formatString("" + asteriskSipUser.getSendrpid()));
			astuserElem.addElement("setvar").addCDATA(formatString("" + asteriskSipUser.getSetvar()));
			astuserElem.addElement("subscribecontext").addCDATA(formatString("" + asteriskSipUser.getSubscribecontext()));
			astuserElem.addElement("subscribemwi").addCDATA(formatString("" + asteriskSipUser.getSubscribemwi()));
			astuserElem.addElement("t38pt_udptl").addCDATA(formatString("" + asteriskSipUser.getId()));
			astuserElem.addElement("trustrpid").addCDATA(formatString("" + asteriskSipUser.getTrustrpid()));
			astuserElem.addElement("type").addCDATA(formatString("" + asteriskSipUser.getType()));
			astuserElem.addElement("useclientcode").addCDATA(formatString("" + asteriskSipUser.getUseclientcode()));
			astuserElem.addElement("username").addCDATA(formatString("" + asteriskSipUser.getUsername()));
			astuserElem.addElement("usereqphone").addCDATA(formatString("" + asteriskSipUser.getUsereqphone()));
			astuserElem.addElement("videosupport").addCDATA(formatString("" + asteriskSipUser.getVideosupport()));
			astuserElem.addElement("vmexten").addCDATA(formatString("" + asteriskSipUser.getVmexten()));

		}
		return document;
		
	}
	
	private Document createExtensionsDocument(List<Extensions> extensions) {
		Document document = getDocument();
		Element root = document.addElement("root");
		Element extensionsElem = root.addElement("extensions");
		
		for (Extensions extension : extensions) {
			Element extensionElem = extensionsElem.addElement("extension");
			extensionElem.addElement("id").addCDATA(formatString("" + extension.getId()));
			extensionElem.addElement("exten").addCDATA(formatString("" + extension.getExten()));
			extensionElem.addElement("priority").addCDATA(formatString("" + extension.getPriority()));
			extensionElem.addElement("app").addCDATA(formatString("" + extension.getApp()));
			extensionElem.addElement("appdata").addCDATA(formatString("" + extension.getAppdata()));
		}
		return document;
	}
	
	private Document createMembersDocument(List<MeetMe> members) {
		Document document = getDocument();
		Element root = document.addElement("root");
		Element membersElem = root.addElement("members");
		
		for (MeetMe member : members) {
			Element memberElem = membersElem.addElement("member");
			memberElem.addElement("confno").addCDATA(formatString("" + member.getConfno()));
			memberElem.addElement("pin").addCDATA(formatString("" + member.getPin()));
			memberElem.addElement("adminpin").addCDATA(formatString("" + member.getAdminpin()));
			memberElem.addElement("members").addCDATA(formatString("" + member.getMembers()));
		}
		return document;
	}
	
	public void serializetoXML(OutputStream out, String aEncodingScheme,
			Document doc) throws Exception {
		OutputFormat outformat = OutputFormat.createPrettyPrint();
		outformat.setXHTML(true);
		outformat.setEncoding(aEncodingScheme);
		XMLWriter writer = new XMLWriter(out, outformat);
		writer.write(doc);
		writer.flush();
		writer.close();
		out.close();
	}

}
