package org.openedit.entermedia.cluster; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Element; import org.openedit.Data; import org.openedit.data.Searcher; import org.openedit.data.SearcherManager; import org.openedit.entermedia.util.SyncFileDownloader; import org.openedit.util.DateStorageUtil; import org.openedit.xml.XmlArchive; import org.openedit.xml.XmlFile; import com.openedit.page.manage.PageManager; import com.openedit.users.User; import com.openedit.users.UserManager; public class RemoteDataManager { private static final Log log = LogFactory.getLog(LocalDataManager.class); protected LocalDataManager fieldLocalDataManager; protected UserManager fieldUserManager; protected PageManager fieldPageManager; protected File fieldRoot; protected SearcherManager fieldSearcherManager; protected XmlArchive fieldXmlArchive; public XmlArchive getXmlArchive() { return fieldXmlArchive; } public void setXmlArchive(XmlArchive inXmlArchive) { fieldXmlArchive = inXmlArchive; } public UserManager getUserManager() { return fieldUserManager; } public void setUserManager(UserManager inUserManager) { fieldUserManager = inUserManager; } public PageManager getPageManager() { return fieldPageManager; } public void setPageManager(PageManager inPageManager) { fieldPageManager = inPageManager; } public File getRoot() { return fieldRoot; } public void setRoot(File inRoot) { fieldRoot = inRoot; } public SearcherManager getSearcherManager() { return fieldSearcherManager; } public void setSearcherManager(SearcherManager inSearcherManager) { fieldSearcherManager = inSearcherManager; } public Map getSyncFileDownloaders() { if (fieldSyncFileDownloaders == null) { fieldSyncFileDownloaders = new HashMap(); } return fieldSyncFileDownloaders; } public static Log getLog() { return log; } protected Map fieldSyncFileDownloaders; public LocalDataManager getLocalDataManager() { return fieldLocalDataManager; } public void setLocalDataManager(LocalDataManager inLocalDataManager) { fieldLocalDataManager = inLocalDataManager; } public Data findNextRemoteServer(String inAppId, String inSelfSiteRoot) { Searcher clusters = getSearcherManager().getSearcher(inAppId, "cluster"); //String thishost = inReq.getSiteRoot(); for (Iterator iterator = clusters.getAllHits().iterator(); iterator.hasNext();) { Data remoteserver = (Data) iterator.next(); String status =remoteserver.get("status"); if( "active".equals(status)) { String host = remoteserver.get("siteroot"); if(!inSelfSiteRoot.equals(host)) { return remoteserver; } } } return null; } public Element importChanges(String inAppId, Data inServer) { //TODO: Look up local change info XmlFile xml = getXmlArchive().getXml("/WEB-INF/data/" + inAppId + "/.versions/clusterstatus.xml"); Element data = xml.getElementById(inServer.getId()); if( data == null) { data = xml.addNewElement(); data.addAttribute("id", inServer.getId()); } String lastchecked = data.attributeValue("lastchecked"); Date lastCheckDate = null; if( lastchecked == null) { //assume 3 days? GregorianCalendar cal = new GregorianCalendar(); cal.add(Calendar.DAY_OF_YEAR, -3); lastchecked = DateStorageUtil.getStorageUtil().formatForStorage(cal.getTime()); } Element changes = listRemoteChanges(inAppId, inServer, lastchecked); Date now = new Date(); importChanges(inAppId, inServer,changes); String date = DateStorageUtil.getStorageUtil().formatForStorage(now); data.addAttribute("lastchecked", date); getXmlArchive().saveXml(xml, null); return changes; } public Element listRemoteChanges(String inAppId,Data inServer, String inLastCheckDate) { SyncFileDownloader downloader = getSyncFileDownloader(inAppId, inServer); downloader.setLastChecked(inLastCheckDate); Element changes = downloader.listRemoteChanges("/WEB-INF/data/" + inAppId); return changes; } protected SyncFileDownloader getSyncFileDownloader(String inAppId, Data inServer) { String id = inAppId + "_" + inServer.getId(); SyncFileDownloader downloader = (SyncFileDownloader)getSyncFileDownloaders().get(id); if( downloader == null) { downloader = new SyncFileDownloader(); downloader.setServerUrl(inServer.get("siteroot")); downloader.setListXml("/" + inAppId + "/services/rest/listdatachanges.xml"); downloader.setLoginPath("/" + inAppId + "/services/rest/login.xml"); downloader.setDownloadPath("/" + inAppId + "/services/rest/downloadfiles.zip"); downloader.setSyncPath( "/WEB-INF/data/" + inAppId ); downloader.setRoot(getRoot()); downloader.setPageManager(getPageManager()); downloader.setUsername("admin"); User user = getUserManager().getUser("admin"); downloader.setPassword(user.getPassword()); // for (Iterator iter = inReq.getCurrentAction().getConfig().getChildIterator("exclude"); iter.hasNext();) // { // Configuration exclude = (Configuration) iter.next(); // server.addExclude(exclude.getValue()); // } getSyncFileDownloaders().put(id,downloader); downloader.login(); } return downloader; } public void importChanges(String inAppId, Data inServer, Element inRootChanges) { log.info(inRootChanges); } }