1 31 32 package org.opencms.importexport; 33 34 import org.opencms.file.CmsFile; 35 import org.opencms.file.CmsFolder; 36 import org.opencms.file.CmsGroup; 37 import org.opencms.file.CmsObject; 38 import org.opencms.file.CmsProperty; 39 import org.opencms.file.CmsResource; 40 import org.opencms.file.CmsResourceFilter; 41 import org.opencms.file.CmsUser; 42 import org.opencms.file.CmsVfsException; 43 import org.opencms.i18n.CmsMessageContainer; 44 import org.opencms.loader.CmsLoaderException; 45 import org.opencms.main.CmsEvent; 46 import org.opencms.main.CmsException; 47 import org.opencms.main.CmsLog; 48 import org.opencms.main.I_CmsEventListener; 49 import org.opencms.main.OpenCms; 50 import org.opencms.report.CmsShellReport; 51 import org.opencms.report.I_CmsReport; 52 import org.opencms.security.CmsAccessControlEntry; 53 import org.opencms.security.CmsRole; 54 import org.opencms.security.CmsRoleViolationException; 55 import org.opencms.util.CmsDateUtil; 56 import org.opencms.util.CmsFileUtil; 57 import org.opencms.util.CmsUUID; 58 import org.opencms.util.CmsXmlSaxWriter; 59 import org.opencms.workplace.CmsWorkplace; 60 61 import java.io.ByteArrayOutputStream ; 62 import java.io.FileOutputStream ; 63 import java.io.IOException ; 64 import java.io.ObjectOutputStream ; 65 import java.io.StringWriter ; 66 import java.util.ArrayList ; 67 import java.util.Collections ; 68 import java.util.HashSet ; 69 import java.util.Iterator ; 70 import java.util.List ; 71 import java.util.Set ; 72 import java.util.zip.ZipEntry ; 73 import java.util.zip.ZipOutputStream ; 74 75 import org.apache.commons.codec.binary.Base64; 76 import org.apache.commons.logging.Log; 77 78 import org.dom4j.Document; 79 import org.dom4j.DocumentHelper; 80 import org.dom4j.Element; 81 import org.dom4j.io.SAXWriter; 82 import org.xml.sax.SAXException ; 83 84 98 public class CmsExport { 99 100 101 private static final Log LOG = CmsLog.getLog(CmsExport.class); 102 103 private static final int SUB_LENGTH = 4096; 104 105 106 private CmsObject m_cms; 107 108 109 private long m_contentAge; 110 111 112 private int m_exportCount; 113 114 115 private Set m_exportedPageFiles; 116 117 118 private Set m_exportedResources; 119 120 121 private String m_exportFileName; 122 123 124 private boolean m_exportUserdata; 125 126 127 private boolean m_exportWebusers; 128 129 130 private ZipOutputStream m_exportZipStream; 131 132 133 private boolean m_includeSystem; 134 135 136 private boolean m_includeUnchanged; 137 138 139 private boolean m_recursive; 140 141 142 private I_CmsReport m_report; 143 144 145 private Element m_resourceNode; 146 147 148 private SAXWriter m_saxWriter; 149 150 151 private List m_superFolders; 152 153 156 public CmsExport() { 157 158 } 160 161 172 public CmsExport( 173 CmsObject cms, 174 String exportFile, 175 List resourcesToExport, 176 boolean includeSystem, 177 boolean includeUnchanged) 178 throws CmsImportExportException, CmsRoleViolationException { 179 180 this(cms, exportFile, resourcesToExport, includeSystem, includeUnchanged, null, false, 0, new CmsShellReport( 181 cms.getRequestContext().getLocale())); 182 } 183 184 202 public CmsExport( 203 CmsObject cms, 204 String exportFile, 205 List resourcesToExport, 206 boolean includeSystem, 207 boolean includeUnchanged, 208 Element moduleElement, 209 boolean exportUserdata, 210 boolean exportWebusers, 211 long contentAge, 212 I_CmsReport report, 213 boolean recursive) 214 throws CmsImportExportException, CmsRoleViolationException { 215 216 setCms(cms); 217 setReport(report); 218 setExportFileName(exportFile); 219 220 cms.checkRole(CmsRole.EXPORT_DATABASE); 222 223 m_includeSystem = includeSystem; 224 m_includeUnchanged = includeUnchanged; 225 m_exportUserdata = exportUserdata; 226 m_exportWebusers = exportWebusers; 227 m_contentAge = contentAge; 228 m_exportCount = 0; 229 m_recursive = recursive; 230 231 report.println(Messages.get().container(Messages.RPT_CLEARCACHE_0), I_CmsReport.FORMAT_NOTE); 233 OpenCms.fireCmsEvent(new CmsEvent(I_CmsEventListener.EVENT_CLEAR_CACHES, Collections.EMPTY_MAP)); 234 235 try { 236 Element exportNode = openExportFile(); 237 238 if (moduleElement != null) { 239 exportNode.add(moduleElement); 241 digestElement(exportNode, moduleElement); 243 } 244 245 exportAllResources(exportNode, resourcesToExport); 246 247 if (m_exportUserdata || m_exportWebusers) { 249 Element userGroupData = exportNode.addElement(CmsImportExportManager.N_USERGROUPDATA); 250 getSaxWriter().writeOpen(userGroupData); 251 252 exportGroups(userGroupData); 253 exportUsers(userGroupData); 254 255 getSaxWriter().writeClose(userGroupData); 256 exportNode.remove(userGroupData); 257 } 258 259 closeExportFile(exportNode); 260 } catch (SAXException se) { 261 getReport().println(se); 262 263 CmsMessageContainer message = Messages.get().container( 264 Messages.ERR_IMPORTEXPORT_ERROR_EXPORTING_TO_FILE_1, 265 getExportFileName()); 266 if (LOG.isDebugEnabled()) { 267 LOG.debug(message.key(), se); 268 } 269 270 throw new CmsImportExportException(message, se); 271 } catch (IOException ioe) { 272 getReport().println(ioe); 273 274 CmsMessageContainer message = Messages.get().container( 275 Messages.ERR_IMPORTEXPORT_ERROR_EXPORTING_TO_FILE_1, 276 getExportFileName()); 277 if (LOG.isDebugEnabled()) { 278 LOG.debug(message.key(), ioe); 279 } 280 281 throw new CmsImportExportException(message, ioe); 282 } 283 } 284 285 301 public CmsExport( 302 CmsObject cms, 303 String exportFile, 304 List resourcesToExport, 305 boolean includeSystem, 306 boolean includeUnchanged, 307 Element moduleElement, 308 boolean exportUserdata, 309 long contentAge, 310 I_CmsReport report) 311 throws CmsImportExportException, CmsRoleViolationException { 312 313 this( 314 cms, 315 exportFile, 316 resourcesToExport, 317 includeSystem, 318 includeUnchanged, 319 moduleElement, 320 exportUserdata, 321 contentAge, 322 report, 323 true); 324 } 325 326 343 public CmsExport( 344 CmsObject cms, 345 String exportFile, 346 List resourcesToExport, 347 boolean includeSystem, 348 boolean includeUnchanged, 349 Element moduleElement, 350 boolean exportUserdata, 351 long contentAge, 352 I_CmsReport report, 353 boolean recursive) 354 throws CmsImportExportException, CmsRoleViolationException { 355 356 this( 357 cms, 358 exportFile, 359 resourcesToExport, 360 includeSystem, 361 includeUnchanged, 362 moduleElement, 363 exportUserdata, 364 false, 365 contentAge, 366 report, 367 recursive); 368 } 369 370 378 protected void addChildResources(String folderName) throws CmsImportExportException, IOException , SAXException { 379 380 try { 381 List subFolders = getCms().getSubFolders(folderName, CmsResourceFilter.IGNORE_EXPIRATION); 383 List subFiles = getCms().getFilesInFolder(folderName, CmsResourceFilter.IGNORE_EXPIRATION); 385 386 for (int i = 0; i < subFiles.size(); i++) { 388 CmsResource file = (CmsResource)subFiles.get(i); 389 int state = file.getState(); 390 long age = file.getDateLastModified() < file.getDateCreated() ? file.getDateCreated() 391 : file.getDateLastModified(); 392 393 if (getCms().getRequestContext().currentProject().isOnlineProject() 394 || (m_includeUnchanged) 395 || state == CmsResource.STATE_NEW 396 || state == CmsResource.STATE_CHANGED) { 397 if ((state != CmsResource.STATE_DELETED) 398 && (!file.getName().startsWith("~")) 399 && (age >= m_contentAge)) { 400 String export = getCms().getSitePath(file); 401 if (checkExportResource(export)) { 402 exportFile(getCms().readFile(export, CmsResourceFilter.IGNORE_EXPIRATION)); 403 } 404 } 405 } 406 subFiles.set(i, null); 408 } 409 subFiles = null; 411 412 for (int i = 0; i < subFolders.size(); i++) { 414 CmsResource folder = (CmsResource)subFolders.get(i); 415 if (folder.getState() != CmsResource.STATE_DELETED) { 416 String export = getCms().getSitePath(folder); 418 if (checkExportResource(export)) { 419 420 long age = folder.getDateLastModified() < folder.getDateCreated() ? folder.getDateCreated() 421 : folder.getDateLastModified(); 422 if (age >= m_contentAge) { 425 appendResourceToManifest(folder, false); 427 } 428 429 addChildResources(getCms().getSitePath(folder)); 431 } 432 } 433 subFolders.set(i, null); 435 } 436 } catch (CmsImportExportException e) { 437 438 throw e; 439 } catch (CmsException e) { 440 441 CmsMessageContainer message = Messages.get().container( 442 Messages.ERR_IMPORTEXPORT_ERROR_ADDING_CHILD_RESOURCES_1, 443 folderName); 444 if (LOG.isDebugEnabled()) { 445 LOG.debug(message.key(), e); 446 } 447 448 throw new CmsImportExportException(message, e); 449 } 450 } 451 452 459 protected void closeExportFile(Element exportNode) throws IOException , SAXException { 460 461 getSaxWriter().writeClose(exportNode); 463 464 CmsXmlSaxWriter xmlSaxWriter = (CmsXmlSaxWriter)getSaxWriter().getContentHandler(); 466 xmlSaxWriter.endDocument(); 467 468 ZipEntry entry = new ZipEntry (CmsImportExportManager.EXPORT_MANIFEST); 470 getExportZipStream().putNextEntry(entry); 471 472 StringBuffer result = ((StringWriter )xmlSaxWriter.getWriter()).getBuffer(); 474 int steps = result.length() / SUB_LENGTH; 475 int rest = result.length() % SUB_LENGTH; 476 int pos = 0; 477 for (int i = 0; i < steps; i++) { 478 String sub = result.substring(pos, pos + SUB_LENGTH); 479 getExportZipStream().write(sub.getBytes(OpenCms.getSystemInfo().getDefaultEncoding())); 480 pos += SUB_LENGTH; 481 } 482 if (rest > 0) { 483 String sub = result.substring(pos, pos + rest); 484 getExportZipStream().write(sub.getBytes(OpenCms.getSystemInfo().getDefaultEncoding())); 485 } 486 487 getExportZipStream().closeEntry(); 489 490 getExportZipStream().close(); 492 } 493 494 502 protected void digestElement(Element parent, Element output) throws SAXException { 503 504 m_saxWriter.write(output); 505 parent.remove(output); 506 } 507 508 517 protected void exportAllResources(Element parent, List resourcesToExport) 518 throws CmsImportExportException, IOException , SAXException { 519 520 String resourceNodeName = getResourceNodeName(); 522 m_resourceNode = parent.addElement(resourceNodeName); 523 getSaxWriter().writeOpen(m_resourceNode); 524 525 if (m_recursive) { 526 resourcesToExport = CmsFileUtil.removeRedundancies(resourcesToExport); 528 } 529 530 List folderNames = new ArrayList (); 532 List fileNames = new ArrayList (); 533 Iterator it = resourcesToExport.iterator(); 534 while (it.hasNext()) { 535 String resource = (String )it.next(); 536 if (CmsResource.isFolder(resource)) { 537 folderNames.add(resource); 538 } else { 539 fileNames.add(resource); 540 } 541 } 542 543 m_exportedResources = new HashSet (); 545 m_exportedPageFiles = new HashSet (); 546 547 for (int i = 0; i < folderNames.size(); i++) { 549 String path = (String )folderNames.get(i); 550 if (m_recursive) { 551 addParentFolders(path); 553 addChildResources(path); 554 } else { 555 CmsFolder folder; 556 try { 557 folder = getCms().readFolder(path, CmsResourceFilter.IGNORE_EXPIRATION); 558 } catch (CmsException e) { 559 CmsMessageContainer message = Messages.get().container( 560 Messages.ERR_IMPORTEXPORT_ERROR_ADDING_PARENT_FOLDERS_1, 561 path); 562 if (LOG.isDebugEnabled()) { 563 LOG.debug(message.key(), e); 564 } 565 throw new CmsImportExportException(message, e); 566 } 567 int state = folder.getState(); 568 long age = folder.getDateLastModified() < folder.getDateCreated() ? folder.getDateCreated() 569 : folder.getDateLastModified(); 570 571 if (getCms().getRequestContext().currentProject().isOnlineProject() 572 || (m_includeUnchanged) 573 || state == CmsResource.STATE_NEW 574 || state == CmsResource.STATE_CHANGED) { 575 if ((state != CmsResource.STATE_DELETED) && (age >= m_contentAge)) { 576 String export = getCms().getSitePath(folder); 578 if (checkExportResource(export)) { 579 appendResourceToManifest(folder, false); 580 } 581 } 582 } 583 } 584 m_exportedResources.add(path); 585 } 586 addFiles(fileNames); 588 addPageBodyFiles(); 590 591 getSaxWriter().writeClose(m_resourceNode); 593 parent.remove(m_resourceNode); 594 m_resourceNode = null; 595 } 596 597 602 protected CmsObject getCms() { 603 604 return m_cms; 605 } 606 607 612 protected String getExportFileName() { 613 614 return m_exportFileName; 615 } 616 617 622 protected String getExportNodeName() { 623 624 return CmsImportExportManager.N_EXPORT; 625 } 626 627 632 protected ZipOutputStream getExportZipStream() { 633 634 return m_exportZipStream; 635 } 636 637 642 protected I_CmsReport getReport() { 643 644 return m_report; 645 } 646 647 652 protected String getResourceNodeName() { 653 654 return "files"; 655 } 656 657 662 protected SAXWriter getSaxWriter() { 663 664 return m_saxWriter; 665 } 666 667 673 protected boolean isIgnoredProperty(CmsProperty property) { 674 675 if (property == null) { 676 return true; 677 } 678 return false; 680 } 681 682 689 protected Element openExportFile() throws IOException , SAXException { 690 691 setExportZipStream(new ZipOutputStream (new FileOutputStream (getExportFileName()))); 693 CmsXmlSaxWriter saxHandler = new CmsXmlSaxWriter( 695 new StringWriter (4096), 696 OpenCms.getSystemInfo().getDefaultEncoding()); 697 saxHandler.setEscapeXml(true); 698 saxHandler.setEscapeUnknownChars(true); 699 setSaxWriter(new SAXWriter(saxHandler, saxHandler)); 701 Document doc = DocumentHelper.createDocument(); 703 saxHandler.startDocument(); 705 706 String exportNodeName = getExportNodeName(); 708 Element exportNode = doc.addElement(exportNodeName); 710 getSaxWriter().writeOpen(exportNode); 711 712 Element info = exportNode.addElement(CmsImportExportManager.N_INFO); 714 info.addElement(CmsImportExportManager.N_CREATOR).addText(getCms().getRequestContext().currentUser().getName()); 715 info.addElement(CmsImportExportManager.N_OC_VERSION).addText(OpenCms.getSystemInfo().getVersionName()); 716 info.addElement(CmsImportExportManager.N_DATE).addText(CmsDateUtil.getHeaderDate(System.currentTimeMillis())); 717 info.addElement(CmsImportExportManager.N_PROJECT).addText( 718 getCms().getRequestContext().currentProject().getName()); 719 info.addElement(CmsImportExportManager.N_VERSION).addText(CmsImportExportManager.EXPORT_VERSION); 720 721 digestElement(exportNode, info); 723 724 return exportNode; 725 } 726 727 732 protected void setCms(CmsObject cms) { 733 734 m_cms = cms; 735 } 736 737 742 protected void setExportFileName(String exportFileName) { 743 744 if (!exportFileName.toLowerCase().endsWith(".zip")) { 746 m_exportFileName = exportFileName + ".zip"; 747 } else { 748 m_exportFileName = exportFileName; 749 } 750 } 751 752 757 protected void setExportZipStream(ZipOutputStream exportZipStream) { 758 759 m_exportZipStream = exportZipStream; 760 } 761 762 767 protected void setReport(I_CmsReport report) { 768 769 m_report = report; 770 } 771 772 777 protected void setSaxWriter(SAXWriter saxWriter) { 778 779 m_saxWriter = saxWriter; 780 } 781 782 791 private void addFiles(List fileNames) throws CmsImportExportException, IOException , SAXException { 792 793 if (fileNames != null) { 794 for (int i = 0; i < fileNames.size(); i++) { 795 String fileName = (String )fileNames.get(i); 796 797 try { 798 CmsFile file = getCms().readFile(fileName, CmsResourceFilter.IGNORE_EXPIRATION); 799 if ((file.getState() != CmsResource.STATE_DELETED) && (!file.getName().startsWith("~"))) { 800 if (checkExportResource(fileName)) { 801 if (m_recursive) { 802 addParentFolders(fileName); 803 } 804 exportFile(file); 805 } 806 } 807 } catch (CmsImportExportException e) { 808 809 throw e; 810 } catch (CmsException e) { 811 if (e instanceof CmsVfsException) { CmsMessageContainer message = Messages.get().container( 813 Messages.ERR_IMPORTEXPORT_ERROR_ADDING_FILE_1, 814 fileName); 815 if (LOG.isDebugEnabled()) { 816 LOG.debug(message.key(), e); 817 } 818 819 throw new CmsImportExportException(message, e); 820 } 821 } 822 } 823 } 824 } 825 826 833 private void addPageBodyFiles() throws CmsImportExportException, IOException , SAXException { 834 835 Iterator i; 836 837 List bodyFileNames = new ArrayList (); 838 String bodyPath = CmsCompatibleCheck.VFS_PATH_BODIES.substring( 839 0, 840 CmsCompatibleCheck.VFS_PATH_BODIES.lastIndexOf("/")); 841 842 i = m_exportedPageFiles.iterator(); 844 while (i.hasNext()) { 845 String filename = (String )i.next(); 846 if (filename.startsWith(CmsResource.VFS_FOLDER_SITES)) { 850 filename = filename.substring(CmsResource.VFS_FOLDER_SITES.length() + 1, filename.length()); 851 filename = filename.substring(filename.indexOf("/"), filename.length()); 852 } 853 String body = bodyPath + filename; 854 bodyFileNames.add(body); 855 } 856 857 addFiles(bodyFileNames); 859 } 860 861 869 private void addParentFolders(String resourceName) throws CmsImportExportException, SAXException { 870 871 try { 872 if (!checkExportResource(resourceName)) { 874 return; 875 } 876 877 if (m_superFolders == null) { 879 m_superFolders = new ArrayList (); 880 } 881 List superFolders = new ArrayList (); 882 883 if (resourceName.lastIndexOf("/") != (resourceName.length() - 1)) { 885 resourceName = resourceName.substring(0, resourceName.lastIndexOf("/") + 1); 886 } 887 while (resourceName.length() > "/".length()) { 888 superFolders.add(resourceName); 889 resourceName = resourceName.substring(0, resourceName.length() - 1); 890 resourceName = resourceName.substring(0, resourceName.lastIndexOf("/") + 1); 891 } 892 for (int i = superFolders.size() - 1; i >= 0; i--) { 893 String addFolder = (String )superFolders.get(i); 894 if (!m_superFolders.contains(addFolder)) { 895 CmsFolder folder = getCms().readFolder(addFolder, CmsResourceFilter.IGNORE_EXPIRATION); 897 appendResourceToManifest(folder, false); 898 m_superFolders.add(addFolder); 900 } 901 } 902 } catch (CmsImportExportException e) { 903 904 throw e; 905 } catch (CmsException e) { 906 907 CmsMessageContainer message = Messages.get().container( 908 Messages.ERR_IMPORTEXPORT_ERROR_ADDING_PARENT_FOLDERS_1, 909 resourceName); 910 if (LOG.isDebugEnabled()) { 911 LOG.debug(message.key(), e); 912 } 913 914 throw new CmsImportExportException(message, e); 915 } 916 } 917 918 926 private void appendResourceToManifest(CmsResource resource, boolean source) 927 throws CmsImportExportException, SAXException { 928 929 try { 930 CmsProperty property = null; 931 String key = null, value = null; 932 Element propertyElement = null; 933 934 Element fileElement = m_resourceNode.addElement(CmsImportExportManager.N_FILE); 936 937 String fileName = trimResourceName(getCms().getSitePath(resource)); 939 if (resource.isFile()) { 940 if (source) { 941 fileElement.addElement(CmsImportExportManager.N_SOURCE).addText(fileName); 942 } 943 } else { 944 m_exportCount++; 945 I_CmsReport report = getReport(); 946 report.print(org.opencms.report.Messages.get().container( 948 org.opencms.report.Messages.RPT_SUCCESSION_1, 949 String.valueOf(m_exportCount)), I_CmsReport.FORMAT_NOTE); 950 report.print(Messages.get().container(Messages.RPT_EXPORT_0), I_CmsReport.FORMAT_NOTE); 951 report.print(org.opencms.report.Messages.get().container( 952 org.opencms.report.Messages.RPT_ARGUMENT_1, 953 getCms().getSitePath(resource))); 954 report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); 955 report.println( 956 org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_OK_0), 957 I_CmsReport.FORMAT_OK); 958 959 if (LOG.isInfoEnabled()) { 960 LOG.info(Messages.get().getBundle().key( 961 Messages.LOG_EXPORTING_OK_2, 962 String.valueOf(m_exportCount), 963 getCms().getSitePath(resource))); 964 } 965 } 966 967 fileElement.addElement(CmsImportExportManager.N_DESTINATION).addText(fileName); 969 fileElement.addElement(CmsImportExportManager.N_TYPE).addText( 971 OpenCms.getResourceManager().getResourceType(resource.getTypeId()).getTypeName()); 972 973 if (resource.isFile()) { 974 fileElement.addElement(CmsImportExportManager.N_UUIDRESOURCE).addText( 976 resource.getResourceId().toString()); 977 } 978 979 fileElement.addElement(CmsImportExportManager.N_DATELASTMODIFIED).addText( 981 CmsDateUtil.getHeaderDate(resource.getDateLastModified())); 982 String userNameLastModified = null; 984 try { 985 userNameLastModified = getCms().readUser(resource.getUserLastModified()).getName(); 986 } catch (CmsException e) { 987 userNameLastModified = OpenCms.getDefaultUsers().getUserAdmin(); 988 } 989 fileElement.addElement(CmsImportExportManager.N_USERLASTMODIFIED).addText(userNameLastModified); 990 fileElement.addElement(CmsImportExportManager.N_DATECREATED).addText( 992 CmsDateUtil.getHeaderDate(resource.getDateCreated())); 993 String userNameCreated = null; 995 try { 996 userNameCreated = getCms().readUser(resource.getUserCreated()).getName(); 997 } catch (CmsException e) { 998 userNameCreated = OpenCms.getDefaultUsers().getUserAdmin(); 999 } 1000 fileElement.addElement(CmsImportExportManager.N_USERCREATED).addText(userNameCreated); 1001 if (resource.getDateReleased() != CmsResource.DATE_RELEASED_DEFAULT) { 1003 fileElement.addElement(CmsImportExportManager.N_DATERELEASED).addText( 1004 CmsDateUtil.getHeaderDate(resource.getDateReleased())); 1005 } 1006 if (resource.getDateExpired() != CmsResource.DATE_EXPIRED_DEFAULT) { 1008 fileElement.addElement(CmsImportExportManager.N_DATEEXPIRED).addText( 1009 CmsDateUtil.getHeaderDate(resource.getDateExpired())); 1010 } 1011 int resFlags = resource.getFlags(); 1013 resFlags &= ~CmsResource.FLAG_LABELED; 1014 fileElement.addElement(CmsImportExportManager.N_FLAGS).addText(Integer.toString(resFlags)); 1015 1016 Element propertiesElement = fileElement.addElement(CmsImportExportManager.N_PROPERTIES); 1018 List properties = getCms().readPropertyObjects(getCms().getSitePath(resource), false); 1019 for (int i = 0, n = properties.size(); i < n; i++) { 1020 property = (CmsProperty)properties.get(i); 1021 1022 if (isIgnoredProperty(property)) { 1023 continue; 1024 } 1025 1026 key = property.getName(); 1027 1028 for (int j = 0; j < 2; j++) { 1029 if ((j == 0 && (value = property.getStructureValue()) != null) 1033 || (j == 1 && (value = property.getResourceValue()) != null)) { 1034 propertyElement = propertiesElement.addElement(CmsImportExportManager.N_PROPERTY); 1035 1036 if (j == 1) { 1037 propertyElement.addAttribute( 1039 CmsImportExportManager.N_PROPERTY_ATTRIB_TYPE, 1040 CmsImportExportManager.N_PROPERTY_ATTRIB_TYPE_SHARED); 1041 } 1042 1043 propertyElement.addElement(CmsImportExportManager.N_NAME).addText(key); 1044 propertyElement.addElement(CmsImportExportManager.N_VALUE).addCDATA(value); 1045 } 1046 } 1047 } 1048 1049 Element acl = fileElement.addElement(CmsImportExportManager.N_ACCESSCONTROL_ENTRIES); 1051 1052 List fileAcEntries = getCms().getAccessControlEntries(getCms().getSitePath(resource), false); 1054 Iterator i = fileAcEntries.iterator(); 1055 1056 while (i.hasNext()) { 1058 CmsAccessControlEntry ace = (CmsAccessControlEntry)i.next(); 1059 Element a = acl.addElement(CmsImportExportManager.N_ACCESSCONTROL_ENTRY); 1060 1061 int flags = ace.getFlags(); 1063 String acePrincipalName = ""; 1064 CmsUUID acePrincipal = ace.getPrincipal(); 1065 if ((flags & CmsAccessControlEntry.ACCESS_FLAGS_GROUP) > 0) { 1066 acePrincipalName = getCms().readGroup(acePrincipal).getPrefixedName(); 1068 } else { 1069 acePrincipalName = getCms().readUser(acePrincipal).getPrefixedName(); 1071 } 1072 1073 a.addElement(CmsImportExportManager.N_ACCESSCONTROL_PRINCIPAL).addText(acePrincipalName); 1074 a.addElement(CmsImportExportManager.N_FLAGS).addText(Integer.toString(flags)); 1075 1076 Element b = a.addElement(CmsImportExportManager.N_ACCESSCONTROL_PERMISSIONSET); 1077 b.addElement(CmsImportExportManager.N_ACCESSCONTROL_ALLOWEDPERMISSIONS).addText( 1078 Integer.toString(ace.getAllowedPermissions())); 1079 b.addElement(CmsImportExportManager.N_ACCESSCONTROL_DENIEDPERMISSIONS).addText( 1080 Integer.toString(ace.getDeniedPermissions())); 1081 } 1082 1083 digestElement(m_resourceNode, fileElement); 1085 } catch (CmsImportExportException e) { 1086 1087 throw e; 1088 } catch (CmsException e) { 1089 1090 CmsMessageContainer message = Messages.get().container( 1091 Messages.ERR_IMPORTEXPORT_ERROR_APPENDING_RESOURCE_TO_MANIFEST_1, 1092 resource.getRootPath()); 1093 if (LOG.isDebugEnabled()) { 1094 LOG.debug(message.key(), e); 1095 } 1096 1097 throw new CmsImportExportException(message, e); 1098 } 1099 } 1100 1101 1107 private boolean checkExportResource(String resourcename) { 1108 1109 return ( !resourcename.startsWith(CmsWorkplace.VFS_PATH_SYSTEM) || resourcename.equalsIgnoreCase(CmsWorkplace.VFS_PATH_SYSTEM) || resourcename.startsWith(CmsCompatibleCheck.VFS_PATH_BODIES) || resourcename.startsWith(CmsWorkplace.VFS_PATH_GALLERIES) || (m_includeSystem && resourcename.startsWith(CmsWorkplace.VFS_PATH_SYSTEM))); 1116 } 1117 1118 1127 private void exportFile(CmsFile file) 1128 throws CmsImportExportException, SAXException , CmsLoaderException, IOException { 1129 1130 String source = trimResourceName(getCms().getSitePath(file)); 1131 I_CmsReport report = getReport(); 1132 m_exportCount++; 1133 report.print(org.opencms.report.Messages.get().container( 1134 org.opencms.report.Messages.RPT_SUCCESSION_1, 1135 String.valueOf(m_exportCount)), I_CmsReport.FORMAT_NOTE); 1136 report.print(Messages.get().container(Messages.RPT_EXPORT_0), I_CmsReport.FORMAT_NOTE); 1137 report.print(org.opencms.report.Messages.get().container( 1138 org.opencms.report.Messages.RPT_ARGUMENT_1, 1139 getCms().getSitePath(file))); 1140 report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); 1141 1142 if (!m_exportedResources.contains(file.getResourceId())) { 1145 ZipEntry entry = new ZipEntry (source); 1146 entry.setTime(file.getDateLastModified()); 1148 getExportZipStream().putNextEntry(entry); 1149 getExportZipStream().write(file.getContents()); 1150 getExportZipStream().closeEntry(); 1151 m_exportedResources.add(file.getResourceId()); 1153 appendResourceToManifest(file, true); 1155 } else { 1156 appendResourceToManifest(file, false); 1158 } 1159 if (OpenCms.getResourceManager().getResourceType(file.getTypeId()).getTypeName().equals("page")) { 1161 m_exportedPageFiles.add("/" + source); 1162 } 1163 1164 if (LOG.isInfoEnabled()) { 1165 LOG.info(Messages.get().getBundle().key(Messages.LOG_EXPORTING_OK_2, String.valueOf(m_exportCount), source)); 1166 } 1167 report.println( 1168 org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_OK_0), 1169 I_CmsReport.FORMAT_OK); 1170 } 1171 1172 1180 private void exportGroup(Element parent, CmsGroup group) throws CmsImportExportException, SAXException { 1181 1182 try { 1183 String parentgroup; 1184 if (group.getParentId().isNullUUID()) { 1185 parentgroup = ""; 1186 } else { 1187 parentgroup = getCms().getParent(group.getName()).getName(); 1188 } 1189 1190 Element e = parent.addElement(CmsImportExportManager.N_GROUPDATA); 1191 e.addElement(CmsImportExportManager.N_NAME).addText(group.getName()); 1192 e.addElement(CmsImportExportManager.N_DESCRIPTION).addCDATA(group.getDescription()); 1193 e.addElement(CmsImportExportManager.N_FLAGS).addText(Integer.toString(group.getFlags())); 1194 e.addElement(CmsImportExportManager.N_PARENTGROUP).addText(parentgroup); 1195 1196 digestElement(parent, e); 1198 } catch (CmsException e) { 1199 1200 CmsMessageContainer message = org.opencms.db.Messages.get().container( 1201 org.opencms.db.Messages.ERR_GET_PARENT_GROUP_1, 1202 group.getName()); 1203 if (LOG.isDebugEnabled()) { 1204 LOG.debug(message.key(), e); 1205 } 1206 1207 throw new CmsImportExportException(message, e); 1208 } 1209 } 1210 1211 1218 private void exportGroups(Element parent) throws CmsImportExportException, SAXException { 1219 1220 try { 1221 I_CmsReport report = getReport(); 1222 List allGroups = getCms().getGroups(); 1223 for (int i = 0, l = allGroups.size(); i < l; i++) { 1224 CmsGroup group = (CmsGroup)allGroups.get(i); 1225 report.print(org.opencms.report.Messages.get().container( 1226 org.opencms.report.Messages.RPT_SUCCESSION_2, 1227 String.valueOf(i + 1), 1228 String.valueOf(l)), I_CmsReport.FORMAT_NOTE); 1229 report.print(Messages.get().container(Messages.RPT_EXPORT_GROUP_0), I_CmsReport.FORMAT_NOTE); 1230 report.print(org.opencms.report.Messages.get().container( 1231 org.opencms.report.Messages.RPT_ARGUMENT_1, 1232 group.getName())); 1233 report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); 1234 exportGroup(parent, group); 1235 report.println( 1236 org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_OK_0), 1237 I_CmsReport.FORMAT_OK); 1238 } 1239 } catch (CmsImportExportException e) { 1240 1241 throw e; 1242 } catch (CmsException e) { 1243 1244 CmsMessageContainer message = org.opencms.db.Messages.get().container( 1245 org.opencms.db.Messages.ERR_GET_GROUPS_0); 1246 if (LOG.isDebugEnabled()) { 1247 LOG.debug(message.key(), e); 1248 } 1249 1250 throw new CmsImportExportException(message, e); 1251 } 1252 } 1253 1254 1262 private void exportUser(Element parent, CmsUser user) throws CmsImportExportException, SAXException { 1263 1264 try { 1265 Element e = parent.addElement(CmsImportExportManager.N_USERDATA); 1267 e.addElement(CmsImportExportManager.N_NAME).addText(user.getName()); 1268 String passwd = new String (Base64.encodeBase64(user.getPassword().getBytes())); 1270 e.addElement(CmsImportExportManager.N_PASSWORD).addCDATA(passwd); 1271 e.addElement(CmsImportExportManager.N_DESCRIPTION).addCDATA(user.getDescription()); 1272 e.addElement(CmsImportExportManager.N_FIRSTNAME).addText(user.getFirstname()); 1273 e.addElement(CmsImportExportManager.N_LASTNAME).addText(user.getLastname()); 1274 e.addElement(CmsImportExportManager.N_EMAIL).addText(user.getEmail()); 1275 e.addElement(CmsImportExportManager.N_FLAGS).addText(Integer.toString(user.getFlags())); 1276 e.addElement(CmsImportExportManager.N_TAG_ADDRESS).addCDATA(user.getAddress()); 1277 e.addElement(CmsImportExportManager.N_TYPE).addText(Integer.toString(user.getType())); 1278 try { 1280 String datfileName = "/~" + CmsImportExportManager.N_USERINFO + "/" + user.getName() + ".dat"; 1281 e.addElement(CmsImportExportManager.N_USERINFO).addText(datfileName); 1283 ByteArrayOutputStream bout = new ByteArrayOutputStream (); 1284 ObjectOutputStream oout = new ObjectOutputStream (bout); 1285 oout.writeObject(user.getAdditionalInfo()); 1286 oout.close(); 1287 byte[] serializedInfo = bout.toByteArray(); 1288 ZipEntry entry = new ZipEntry (datfileName); 1290 getExportZipStream().putNextEntry(entry); 1291 getExportZipStream().write(serializedInfo); 1292 getExportZipStream().closeEntry(); 1293 } catch (IOException ioe) { 1294 getReport().println(ioe); 1295 1296 if (LOG.isErrorEnabled()) { 1297 LOG.error(Messages.get().getBundle().key( 1298 Messages.ERR_IMPORTEXPORT_ERROR_EXPORTING_USER_1, 1299 user.getName()), ioe); 1300 } 1301 } 1302 List userGroups = getCms().getDirectGroupsOfUser(user.getName()); 1304 Element g = e.addElement(CmsImportExportManager.N_USERGROUPS); 1305 for (int i = 0; i < userGroups.size(); i++) { 1306 String groupName = ((CmsGroup)userGroups.get(i)).getName(); 1307 g.addElement(CmsImportExportManager.N_GROUPNAME).addElement(CmsImportExportManager.N_NAME).addText( 1308 groupName); 1309 } 1310 digestElement(parent, e); 1312 } catch (CmsException e) { 1313 1314 CmsMessageContainer message = org.opencms.db.Messages.get().container( 1315 org.opencms.db.Messages.ERR_GET_GROUPS_OF_USER_1, 1316 user.getName()); 1317 if (LOG.isDebugEnabled()) { 1318 LOG.debug(message.key(), e); 1319 } 1320 1321 throw new CmsImportExportException(message, e); 1322 } 1323 } 1324 1325 1332 private void exportUsers(Element parent) throws CmsImportExportException, SAXException { 1333 1334 try { 1335 I_CmsReport report = getReport(); 1336 List allUsers = new ArrayList (); 1337 if (m_exportUserdata) { 1338 allUsers.addAll(getCms().getUsers()); 1340 } 1341 if (m_exportWebusers) { 1342 allUsers.addAll(getCms().getUsers(CmsUser.USER_TYPE_WEBUSER)); 1344 } 1345 for (int i = 0, l = allUsers.size(); i < l; i++) { 1346 CmsUser user = (CmsUser)allUsers.get(i); 1347 report.print(org.opencms.report.Messages.get().container( 1348 org.opencms.report.Messages.RPT_SUCCESSION_2, 1349 String.valueOf(i + 1), 1350 String.valueOf(l)), I_CmsReport.FORMAT_NOTE); 1351 report.print(Messages.get().container(Messages.RPT_EXPORT_USER_0), I_CmsReport.FORMAT_NOTE); 1352 report.print(org.opencms.report.Messages.get().container( 1353 org.opencms.report.Messages.RPT_ARGUMENT_1, 1354 user.getName())); 1355 report.print(org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_DOTS_0)); 1356 exportUser(parent, user); 1357 report.println( 1358 org.opencms.report.Messages.get().container(org.opencms.report.Messages.RPT_OK_0), 1359 I_CmsReport.FORMAT_OK); 1360 } 1361 } catch (CmsImportExportException e) { 1362 1363 throw e; 1364 } catch (CmsException e) { 1365 1366 CmsMessageContainer message = org.opencms.db.Messages.get().container( 1367 org.opencms.db.Messages.ERR_GET_USERS_0); 1368 if (LOG.isDebugEnabled()) { 1369 LOG.debug(message.key(), e); 1370 } 1371 1372 throw new CmsImportExportException(message, e); 1373 } 1374 } 1375 1376 1382 private String trimResourceName(String resourceName) { 1383 1384 if (resourceName.startsWith("/")) { 1385 resourceName = resourceName.substring(1); 1386 } 1387 if (resourceName.endsWith("/")) { 1388 resourceName = resourceName.substring(0, resourceName.length() - 1); 1389 } 1390 return resourceName; 1391 } 1392} 1393 | Popular Tags |