Morning merge.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2889 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park 2006-05-14 16:21:55 +00:00
parent f19fa92b31
commit 1d601e1be7
29 changed files with 788 additions and 104 deletions

View File

@ -27,6 +27,9 @@
<!-- Bootstrap Files --> <!-- Bootstrap Files -->
<bean id="systemInfoBootstrap" parent="systemInfoImporter">
</bean>
<bean id="userBootstrap" parent="userStoreImporter"> <bean id="userBootstrap" parent="userStoreImporter">
<property name="bootstrapViews"> <property name="bootstrapViews">
<list> <list>

View File

@ -0,0 +1,21 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<bean id="mimetypeConfigService" class="org.alfresco.config.xml.XMLConfigService" init-method="init">
<constructor-arg>
<bean class="org.alfresco.config.source.UrlConfigSource">
<constructor-arg>
<list>
<value>classpath:alfresco/mimetype/mimetype-map.xml</value>
<value>classpath:alfresco/mimetype/mimetype-map-openoffice.xml</value>
<value>classpath:alfresco/extension/mimetypes-extension.xml</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</beans>

View File

@ -0,0 +1,13 @@
<alfresco-config area="mimetype-map">
<config evaluator="string-compare" condition="Mimetype Map">
<mimetypes>
<mimetype mimetype="application/XXX" display="Example mimetype">
<extension>ex</extension>
</mimetype>
</mimetypes>
</config>
</alfresco-config>

View File

@ -3,6 +3,12 @@
<beans> <beans>
<bean id="systemInfoBootstrap" parent="systemInfoImporter">
<property name="bootstrapView">
<value>alfresco/extension/restore/export_systeminfo.xml</value>
</property>
</bean>
<bean id="userBootstrap" parent="userStoreImporter"> <bean id="userBootstrap" parent="userStoreImporter">
<property name="bootstrapViews"> <property name="bootstrapViews">
<list> <list>
@ -39,6 +45,17 @@
<property name="log"><value>true</value></property> <property name="log"><value>true</value></property>
</bean> </bean>
<bean id="spacesArchiveBootstrap" parent="spacesArchiveStoreImporter">
<property name="bootstrapViews">
<list>
<props>
<prop key="path">/</prop>
<prop key="location">alfresco/extension/restore/export_spaces_archive.acp</prop>
</props>
</list>
</property>
</bean>
<bean id="spacesBootstrap" parent="spacesStoreImporter"> <bean id="spacesBootstrap" parent="spacesStoreImporter">
<property name="bootstrapViews"> <property name="bootstrapViews">
<list> <list>

View File

@ -94,6 +94,9 @@
<property name="nodeService"> <property name="nodeService">
<ref bean="NodeService" /> <ref bean="NodeService" />
</property> </property>
<property name="systemExporter">
<ref bean="systemExporterImporter" />
</property>
<property name="stores"> <property name="stores">
<list> <list>
<props> <props>
@ -108,6 +111,10 @@
<prop key="storeRef">${spaces.store}</prop> <prop key="storeRef">${spaces.store}</prop>
<prop key="packageName">spaces</prop> <prop key="packageName">spaces</prop>
</props> </props>
<props>
<prop key="storeRef">${spaces.archive.store}</prop>
<prop key="packageName">spaces_archive</prop>
</props>
<props> <props>
<prop key="storeRef">workspace://lightWeightVersionStore</prop> <prop key="storeRef">workspace://lightWeightVersionStore</prop>
<prop key="packageName">versions</prop> <prop key="packageName">versions</prop>
@ -116,6 +123,40 @@
</property> </property>
</bean> </bean>
<bean id="systemExporterImporter" class="org.alfresco.repo.importer.system.SystemExporterImporter">
<property name="nodeService">
<ref bean="nodeService" />
</property>
<property name="patchDao">
<ref bean="patchDaoComponent" />
</property>
<property name="versionDao">
<ref bean="versionCounterDaoComponent" />
</property>
</bean>
<!-- System Info Importer -->
<bean id="systemInfoImporter" class="org.alfresco.repo.importer.system.SystemInfoBootstrap" abstract="true">
<property name="transactionService">
<ref bean="transactionComponent"/>
</property>
<property name="nodeService">
<ref bean="nodeService"/>
</property>
<property name="authenticationComponent">
<ref bean="authenticationComponent" />
</property>
<property name="systemImporter">
<ref bean="systemExporterImporter" />
</property>
<property name="mustNotExistStoreUrls">
<list>
<value>${system.store}</value>
</list>
</property>
</bean>
<!-- General Repository Store Importer --> <!-- General Repository Store Importer -->

View File

@ -69,7 +69,8 @@ export.title=Export a Space
export.description=Exports a Space and optionally it's children to an Alfresco export package. export.description=Exports a Space and optionally it's children to an Alfresco export package.
export.package.description=Alfresco content package for Space ''{0}''. export.package.description=Alfresco content package for Space ''{0}''.
export.root.package.description=Alfresco content package for complete Repository. export.root.package.description=Alfresco content package for complete Repository.
export.store.package.description=Alfresco export of store ''{0}''. export.store.package.description=Alfresco Repository export of store ''{0}''.
export.generic.package.description=Alfresco Repository export.
export.package.error=Failed to find temporary file for export export.package.error=Failed to find temporary file for export
script.title=Execute a script script.title=Execute a script

View File

@ -131,11 +131,6 @@
<type>d:childassocref</type> <type>d:childassocref</type>
<mandatory>true</mandatory> <mandatory>true</mandatory>
</property> </property>
<property name="sys:archivedOriginalPath">
<type>d:any</type>
<mandatory>true</mandatory>
<index enabled="false" />
</property>
<property name="sys:archivedBy"> <property name="sys:archivedBy">
<type>d:text</type> <type>d:text</type>
<mandatory>true</mandatory> <mandatory>true</mandatory>

View File

@ -9,9 +9,12 @@
</target> </target>
<target name="compile-jibx" depends="init"> <target name="compile-jibx" depends="init">
<bind verbose="false" load="true" binding="${file.jibx.binding}"> <bind verbose="false" load="true" binding="${file.jibx.binding.m2}">
<classpathset dir="${dir.classes}"/> <classpathset dir="${dir.classes}"/>
</bind> </bind>
<bind verbose="false" load="true" binding="${file.jibx.binding.systeminfo}">
<classpathset dir="${dir.classes}"/>
</bind>
</target> </target>
<target name="build-single-jar" depends="common.compile-java" description="Build an self-contained executable jar" > <target name="build-single-jar" depends="common.compile-java" description="Build an self-contained executable jar" >

View File

@ -1,4 +1,5 @@
file.jibx.binding=${dir.src.java}/org/alfresco/repo/dictionary/m2binding.xml file.jibx.binding.m2=${dir.src.java}/org/alfresco/repo/dictionary/m2binding.xml
file.jibx.binding.systeminfo=${dir.src.java}/org/alfresco/repo/importer/system/systeminfo.xml
dir.javadoc.api.service=${dir.docs}/java-public-service-api dir.javadoc.api.service=${dir.docs}/java-public-service-api
tck.webinf.lib.excludes=${webinf.lib.excludes},jcr-1.0.jar tck.webinf.lib.excludes=${webinf.lib.excludes},jcr-1.0.jar

View File

@ -42,7 +42,6 @@ public interface ContentModel
// archived nodes aspect constants // archived nodes aspect constants
static final QName ASPECT_ARCHIVED = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archived"); static final QName ASPECT_ARCHIVED = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archived");
static final QName PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedOriginalParentAssoc"); static final QName PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedOriginalParentAssoc");
static final QName PROP_ARCHIVED_ORIGINAL_PATH = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedOriginalPath");
static final QName PROP_ARCHIVED_BY = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedBy"); static final QName PROP_ARCHIVED_BY = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedBy");
static final QName PROP_ARCHIVED_DATE = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedDate"); static final QName PROP_ARCHIVED_DATE = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archivedDate");
static final QName ASPECT_ARCHIVED_ASSOCS = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archived-assocs"); static final QName ASPECT_ARCHIVED_ASSOCS = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "archived-assocs");

View File

@ -56,4 +56,11 @@ public interface VersionCount
* @see #incrementVersionCount() * @see #incrementVersionCount()
*/ */
public int getVersionCount(); public int getVersionCount();
/**
* Sets the current version counter
*
* @param versionCount the new version counter
*/
public void setVersionCount(int versionCount);
} }

View File

@ -114,7 +114,7 @@ public class ChildAssocImpl implements ChildAssoc
this.qName, this.qName,
child.getNodeRef(), child.getNodeRef(),
this.isPrimary, this.isPrimary,
-1); index);
} }
return childAssocRef; return childAssocRef;
} }

View File

@ -74,13 +74,24 @@ public class NodeAssocImpl implements NodeAssoc
public AssociationRef getNodeAssocRef() public AssociationRef getNodeAssocRef()
{ {
boolean trashReference = false;
// first check if it is available // first check if it is available
refReadLock.lock(); refReadLock.lock();
try try
{ {
if (nodeAssocRef != null) if (nodeAssocRef != null)
{ {
return nodeAssocRef; // double check that the parent and child node references match those of our reference
if (nodeAssocRef.getSourceRef() != source.getNodeRef() ||
nodeAssocRef.getTargetRef() != target.getNodeRef())
{
trashReference = true;
}
else
{
// we are sure that the reference is correct
return nodeAssocRef;
}
} }
} }
finally finally
@ -92,7 +103,7 @@ public class NodeAssocImpl implements NodeAssoc
try try
{ {
// double check // double check
if (nodeAssocRef == null ) if (nodeAssocRef == null || trashReference)
{ {
nodeAssocRef = new AssociationRef( nodeAssocRef = new AssociationRef(
getSource().getNodeRef(), getSource().getNodeRef(),

View File

@ -85,7 +85,7 @@ public class VersionCountImpl implements VersionCount
/** /**
* For Hibernate use * For Hibernate use
*/ */
private void setVersionCount(int versionCount) public void setVersionCount(int versionCount)
{ {
this.versionCount = versionCount; this.versionCount = versionCount;
} }

View File

@ -179,4 +179,22 @@ public class VersionCounterDaoComponentImpl
// get an incremented count // get an incremented count
versionCounter.resetVersionCount(); versionCounter.resetVersionCount();
} }
/**
* Sets the version number for a specified store.
*
* WARNING: calling this method will completely reset the current
* version count for the specified store and cannot be undone.
*
* @param storeRef the store reference
* @param versionCount the new version count
*/
public synchronized void setVersionNumber(StoreRef storeRef, int versionCount)
{
// get the version counter
VersionCount versionCounter = getVersionCounter(storeRef);
// get an incremented count
versionCounter.setVersionCount(versionCount);
}
} }

View File

@ -30,6 +30,7 @@ import java.util.Properties;
import org.alfresco.i18n.I18NUtil; import org.alfresco.i18n.I18NUtil;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.importer.system.SystemExporterImporter;
import org.alfresco.service.cmr.model.FileExistsException; import org.alfresco.service.cmr.model.FileExistsException;
import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileInfo;
@ -64,6 +65,7 @@ public class RepositoryExporterComponent implements RepositoryExporterService
private ExporterService exporterService; private ExporterService exporterService;
private MimetypeService mimetypeService; private MimetypeService mimetypeService;
private FileFolderService fileFolderService; private FileFolderService fileFolderService;
private SystemExporterImporter systemExporterImporter;
private NodeService nodeService; private NodeService nodeService;
private List<Properties> exportStores; private List<Properties> exportStores;
@ -82,6 +84,11 @@ public class RepositoryExporterComponent implements RepositoryExporterService
{ {
this.fileFolderService = fileFolderService; this.fileFolderService = fileFolderService;
} }
public void setSystemExporter(SystemExporterImporter systemExporterImporter)
{
this.systemExporterImporter = systemExporterImporter;
}
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService)
{ {
@ -104,7 +111,7 @@ public class RepositoryExporterComponent implements RepositoryExporterService
return exportHandles.toArray(new FileExportHandle[exportHandles.size()]); return exportHandles.toArray(new FileExportHandle[exportHandles.size()]);
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.alfresco.service.cmr.view.RepositoryExporterService#export(java.io.File) * @see org.alfresco.service.cmr.view.RepositoryExporterService#export(java.io.File)
@ -136,14 +143,27 @@ public class RepositoryExporterComponent implements RepositoryExporterService
} }
List<FileExportHandle> exportHandles = exportStores(exportStores, packageName, new TempFileExporter()); List<FileExportHandle> exportHandles = exportStores(exportStores, packageName, new TempFileExporter());
Map<String, String> mimetypeExtensions = mimetypeService.getExtensionsByMimetype();
List<RepositoryExportHandle> repoExportHandles = new ArrayList<RepositoryExportHandle>(exportHandles.size()); List<RepositoryExportHandle> repoExportHandles = new ArrayList<RepositoryExportHandle>(exportHandles.size());
for (FileExportHandle exportHandle : exportHandles) for (FileExportHandle exportHandle : exportHandles)
{ {
String description = I18NUtil.getMessage("export.store.package.description", new Object[] { exportHandle.storeRef.getIdentifier() }); String name = exportHandle.packageName + "." + mimetypeExtensions.get(exportHandle.mimeType);
NodeRef repoExportFile = addExportFile(repositoryDestination, exportHandle.packageName, description, exportHandle.exportFile); String title = exportHandle.packageName;
String description;
if (exportHandle.storeRef != null)
{
description = I18NUtil.getMessage("export.store.package.description", new Object[] { exportHandle.storeRef.toString() });
}
else
{
description = I18NUtil.getMessage("export.generic.package.description");
}
NodeRef repoExportFile = addExportFile(repositoryDestination, name, title, description, exportHandle.mimeType, exportHandle.exportFile);
RepositoryExportHandle handle = new RepositoryExportHandle(); RepositoryExportHandle handle = new RepositoryExportHandle();
handle.storeRef = exportHandle.storeRef; handle.storeRef = exportHandle.storeRef;
handle.packageName = exportHandle.packageName; handle.packageName = exportHandle.packageName;
handle.mimeType = exportHandle.mimeType;
handle.exportFile = repoExportFile; handle.exportFile = repoExportFile;
repoExportHandles.add(handle); repoExportHandles.add(handle);
} }
@ -161,16 +181,15 @@ public class RepositoryExporterComponent implements RepositoryExporterService
* @param exportFile the .acp file * @param exportFile the .acp file
* @return node reference to import .acp file * @return node reference to import .acp file
*/ */
private NodeRef addExportFile(NodeRef repoDestination, String packageName, String packageDescription, File exportFile) private NodeRef addExportFile(NodeRef repoDestination, String name, String title, String description, String mimeType, File exportFile)
{ {
// //
// import temp file into repository // import temp file into repository
// //
// determine if file already exists // determine if file already exists
String fileName = packageName + "." + ACPExportPackageHandler.ACP_EXTENSION;
List<String> paths = new ArrayList<String>(); List<String> paths = new ArrayList<String>();
paths.add(fileName); paths.add(name);
try try
{ {
FileInfo fileInfo = fileFolderService.resolveNamePath(repoDestination, paths); FileInfo fileInfo = fileFolderService.resolveNamePath(repoDestination, paths);
@ -186,16 +205,16 @@ public class RepositoryExporterComponent implements RepositoryExporterService
NodeRef exportFileNodeRef = null; NodeRef exportFileNodeRef = null;
try try
{ {
FileInfo fileInfo = fileFolderService.create(repoDestination, fileName, ContentModel.TYPE_CONTENT); FileInfo fileInfo = fileFolderService.create(repoDestination, name, ContentModel.TYPE_CONTENT);
ContentWriter writer = fileFolderService.getWriter(fileInfo.getNodeRef()); ContentWriter writer = fileFolderService.getWriter(fileInfo.getNodeRef());
writer.setMimetype(MimetypeMap.MIMETYPE_ACP); writer.setMimetype(mimeType);
writer.putContent(exportFile); writer.putContent(exportFile);
exportFileNodeRef = fileInfo.getNodeRef(); exportFileNodeRef = fileInfo.getNodeRef();
// add a title for Web Client viewing // add a title for Web Client viewing
Map<QName, Serializable> titledProps = new HashMap<QName, Serializable>(3, 1.0f); Map<QName, Serializable> titledProps = new HashMap<QName, Serializable>(3, 1.0f);
titledProps.put(ContentModel.PROP_TITLE, packageName); titledProps.put(ContentModel.PROP_TITLE, title);
titledProps.put(ContentModel.PROP_DESCRIPTION, packageDescription); titledProps.put(ContentModel.PROP_DESCRIPTION, description);
nodeService.addAspect(exportFileNodeRef, ContentModel.ASPECT_TITLED, titledProps); nodeService.addAspect(exportFileNodeRef, ContentModel.ASPECT_TITLED, titledProps);
} }
@ -209,7 +228,7 @@ public class RepositoryExporterComponent implements RepositoryExporterService
/** /**
* Contract for exporting a store * Contract for exporting a repository
* *
* @author davidc * @author davidc
* *
@ -218,6 +237,8 @@ public class RepositoryExporterComponent implements RepositoryExporterService
private interface ExportStore<ExportHandleType extends ExportHandle> private interface ExportStore<ExportHandleType extends ExportHandle>
{ {
public ExportHandleType exportStore(ExporterCrawlerParameters exportParameters, String packageName, Exporter progress); public ExportHandleType exportStore(ExporterCrawlerParameters exportParameters, String packageName, Exporter progress);
public ExportHandleType exportSystem(String packageName);
} }
@ -231,7 +252,16 @@ public class RepositoryExporterComponent implements RepositoryExporterService
*/ */
private <ExportHandleType extends ExportHandle> List<ExportHandleType> exportStores(List<Properties> stores, String packageName, ExportStore<ExportHandleType> exportStore) private <ExportHandleType extends ExportHandle> List<ExportHandleType> exportStores(List<Properties> stores, String packageName, ExportStore<ExportHandleType> exportStore)
{ {
List<ExportHandleType> exportHandles = new ArrayList<ExportHandleType>(stores.size()); List<ExportHandleType> exportHandles = new ArrayList<ExportHandleType>(stores.size() +1);
// export repository system info
{
String completePackageName = (packageName == null) ? "systeminfo" : packageName + "_systeminfo";
ExportHandleType systemInfoHandle = exportStore.exportSystem(completePackageName);
exportHandles.add(systemInfoHandle);
}
// export each store
for (Properties store : stores) for (Properties store : stores)
{ {
// retrieve store reference to export // retrieve store reference to export
@ -319,9 +349,39 @@ public class RepositoryExporterComponent implements RepositoryExporterService
FileExportHandle handle = new FileExportHandle(); FileExportHandle handle = new FileExportHandle();
handle.storeRef = exportParameters.getExportFrom().getStoreRef(); handle.storeRef = exportParameters.getExportFrom().getStoreRef();
handle.packageName = packageName; handle.packageName = packageName;
handle.mimeType = MimetypeMap.MIMETYPE_ACP;
handle.exportFile = tempFile; handle.exportFile = tempFile;
return handle; return handle;
}; }
/*
* (non-Javadoc)
* @see org.alfresco.repo.exporter.RepositoryExporterComponent.ExportStore#exportSystem()
*/
public FileExportHandle exportSystem(String packageName)
{
// create a temporary file to hold the system info export
File tempFile = TempFileProvider.createTempFile("repoExpSystemInfo", ".xml");
try
{
OutputStream outputStream = new FileOutputStream(tempFile);
systemExporterImporter.exportSystem(outputStream);
}
catch(FileNotFoundException e)
{
tempFile.delete();
throw new ExporterException("Failed to create temporary file for holding export of system info");
}
// return handle onto temp file
FileExportHandle handle = new FileExportHandle();
handle.storeRef = null;
handle.packageName = packageName;
handle.mimeType = MimetypeMap.MIMETYPE_XML;
handle.exportFile = tempFile;
return handle;
}
}; };
@ -374,50 +434,40 @@ public class RepositoryExporterComponent implements RepositoryExporterService
FileExportHandle handle = new FileExportHandle(); FileExportHandle handle = new FileExportHandle();
handle.storeRef = exportParameters.getExportFrom().getStoreRef(); handle.storeRef = exportParameters.getExportFrom().getStoreRef();
handle.packageName = packageName; handle.packageName = packageName;
handle.mimeType = MimetypeMap.MIMETYPE_ACP;
handle.exportFile = file; handle.exportFile = file;
return handle; return handle;
};
};
/**
* Export a store to Repository File
*
* @author davidc
*/
@SuppressWarnings("unused")
private class RepositoryFileExporter implements ExportStore<RepositoryExportHandle>
{
private TempFileExporter tempFileExporter = new TempFileExporter();
private NodeRef repoDestination;
/**
* Construct
*
* @param repoDestination destination within repository to create export file
*/
public RepositoryFileExporter(NodeRef repoDestination)
{
this.repoDestination = repoDestination;
} }
/*
* (non-Javadoc)
* @see org.alfresco.repo.exporter.RepositoryExporterComponent.ExportStore#exportStore(org.alfresco.service.cmr.view.ExporterCrawlerParameters, java.lang.String, org.alfresco.service.cmr.view.Exporter)
*/
public RepositoryExportHandle exportStore(ExporterCrawlerParameters exportParameters, String packageName, Exporter progress)
{
// export acp to temporary file
FileExportHandle tempFile = tempFileExporter.exportStore(exportParameters, packageName, progress);
String description = I18NUtil.getMessage("export.store.package.description", new Object[] { tempFile.storeRef.getIdentifier() }); /*
NodeRef repoExportFile = addExportFile(repoDestination, packageName, description, tempFile.exportFile); * (non-Javadoc)
RepositoryExportHandle handle = new RepositoryExportHandle(); * @see org.alfresco.repo.exporter.RepositoryExporterComponent.ExportStore#exportSystem()
handle.storeRef = exportParameters.getExportFrom().getStoreRef(); */
public FileExportHandle exportSystem(String packageName)
{
// create a temporary file to hold the system info export
File tempFile = TempFileProvider.createTempFile("repoExpSystemInfo", ".xml");
try
{
OutputStream outputStream = new FileOutputStream(tempFile);
systemExporterImporter.exportSystem(outputStream);
}
catch(FileNotFoundException e)
{
tempFile.delete();
throw new ExporterException("Failed to create temporary file for holding export of system info");
}
// return handle onto temp file
FileExportHandle handle = new FileExportHandle();
handle.storeRef = null;
handle.packageName = packageName; handle.packageName = packageName;
handle.exportFile = repoExportFile; handle.mimeType = MimetypeMap.MIMETYPE_XML;
handle.exportFile = tempFile;
return handle; return handle;
} }
}; };
} }

View File

@ -64,13 +64,13 @@ public class RepositoryExporterComponentTest extends BaseSpringTest
{ {
FileExportHandle[] handles = repositoryService.export("test"); FileExportHandle[] handles = repositoryService.export("test");
assertNotNull(handles); assertNotNull(handles);
assertEquals(4, handles.length); assertEquals(6, handles.length);
for (FileExportHandle tempFile : handles) for (FileExportHandle tempFile : handles)
{ {
assertTrue(tempFile.exportFile.exists()); assertTrue(tempFile.exportFile.exists());
} }
} }
public void xtestRepositoryExport() public void xtestRepositoryExport()
throws Exception throws Exception
{ {
@ -82,7 +82,7 @@ public class RepositoryExporterComponentTest extends BaseSpringTest
// Export stores // Export stores
RepositoryExportHandle[] handles = repositoryService.export(container.getNodeRef(), "test"); RepositoryExportHandle[] handles = repositoryService.export(container.getNodeRef(), "test");
assertNotNull(handles); assertNotNull(handles);
assertEquals(4, handles.length); assertEquals(6, handles.length);
for (RepositoryExportHandle handle : handles) for (RepositoryExportHandle handle : handles)
{ {
assertTrue(nodeService.exists(handle.exportFile)); assertTrue(nodeService.exists(handle.exportFile));

View File

@ -55,7 +55,6 @@ import org.apache.log4j.Logger;
import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.FileCopyUtils; import org.springframework.util.FileCopyUtils;
/** /**

View File

@ -0,0 +1,39 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* 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.alfresco.repo.importer.system;
import java.util.Date;
/**
* Data holder of patch information that's to be exported and imported
*
* @author davidc
*/
public class PatchInfo
{
public String id = null;
public String description = null;
public Integer fixesFromSchema = null;
public Integer fixesToSchema = null;
public Integer targetSchema = null;
public Integer appliedToSchema = null;
public String appliedToServer = null;
public Date appliedOnDate = null;
public Boolean wasExecuted = null;
public Boolean succeeded = null;
public String report = null;
}

View File

@ -0,0 +1,135 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* 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.alfresco.repo.importer.system;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.alfresco.repo.admin.patch.PatchDaoService;
import org.alfresco.repo.domain.AppliedPatch;
import org.alfresco.repo.domain.hibernate.VersionCounterDaoComponentImpl;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
/**
* Exporter and Importer of Repository System Information
*
* @author davidc
*/
public class SystemExporterImporter
{
// dependencies
private NodeService nodeService;
private PatchDaoService patchDao;
private VersionCounterDaoComponentImpl versionCounterDao;
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
public void setPatchDao(PatchDaoService patchDaoService)
{
this.patchDao = patchDaoService;
}
public void setVersionDao(VersionCounterDaoComponentImpl versionCounterDao)
{
this.versionCounterDao = versionCounterDao;
}
/**
* Export Repository System Information
*
* @param exportStream output stream to export to
*/
public void exportSystem(OutputStream exportStream)
{
SystemInfo systemInfo = new SystemInfo();
// capture applied patches
List<AppliedPatch> patches = patchDao.getAppliedPatches();
for (AppliedPatch patch : patches)
{
PatchInfo patchInfo = new PatchInfo();
patchInfo.appliedOnDate = patch.getAppliedOnDate();
patchInfo.appliedToSchema = patch.getAppliedToSchema();
patchInfo.appliedToServer = patch.getAppliedToServer();
patchInfo.description = patch.getDescription();
patchInfo.fixesFromSchema = patch.getFixesFromSchema();
patchInfo.fixesToSchema = patch.getFixesToSchema();
patchInfo.id = patch.getId();
patchInfo.report = patch.getReport();
patchInfo.succeeded = patch.getSucceeded();
patchInfo.targetSchema = patch.getTargetSchema();
patchInfo.wasExecuted = patch.getWasExecuted();
systemInfo.patches.add(patchInfo);
}
// capture version counters
List<StoreRef> storeRefs = nodeService.getStores();
for (StoreRef storeRef : storeRefs)
{
VersionCounterInfo versionCounterInfo = new VersionCounterInfo();
int versionCount = versionCounterDao.currentVersionNumber(storeRef);
versionCounterInfo.storeRef = storeRef.toString();
versionCounterInfo.count = versionCount;
systemInfo.versionCounters.add(versionCounterInfo);
}
systemInfo.toXML(exportStream);
}
/**
* Import Repository System Information
*
* @param importStream input stream to import from
*/
public void importSystem(InputStream importStream)
{
SystemInfo systemInfo = SystemInfo.createSystemInfo(importStream);
// apply patch info
for (PatchInfo patchInfo : systemInfo.patches)
{
AppliedPatch patch = patchDao.newAppliedPatch(patchInfo.id);
patch.setAppliedOnDate(patchInfo.appliedOnDate);
patch.setAppliedToSchema(patchInfo.appliedToSchema);
patch.setAppliedToServer(patchInfo.appliedToServer);
patch.setDescription(patchInfo.description);
patch.setFixesFromSchema(patchInfo.fixesFromSchema);
patch.setFixesToSchema(patchInfo.fixesToSchema);
patch.setReport(patchInfo.report);
patch.setSucceeded(patchInfo.succeeded);
patch.setTargetSchema(patchInfo.targetSchema);
patch.setWasExecuted(patchInfo.wasExecuted);
}
// apply version counters
for (VersionCounterInfo versionCounterInfo : systemInfo.versionCounters)
{
StoreRef storeRef = new StoreRef(versionCounterInfo.storeRef);
versionCounterDao.setVersionNumber(storeRef, versionCounterInfo.count);
}
}
}

View File

@ -0,0 +1,85 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* 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.alfresco.repo.importer.system;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.service.cmr.dictionary.DictionaryException;
import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IBindingFactory;
import org.jibx.runtime.IMarshallingContext;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;
/**
* Root data holder of Repository system information to be exported and imported
*
* @author davidc
*/
public class SystemInfo
{
public List<PatchInfo> patches = new ArrayList<PatchInfo>();
public List<VersionCounterInfo> versionCounters = new ArrayList<VersionCounterInfo>();
/**
* Create System Info from XML representation
*
* @param xml xml representation of system info
* @return the System Info
*/
public static SystemInfo createSystemInfo(InputStream xml)
{
try
{
IBindingFactory factory = BindingDirectory.getFactory(SystemInfo.class);
IUnmarshallingContext context = factory.createUnmarshallingContext();
Object obj = context.unmarshalDocument(xml, null);
return (SystemInfo)obj;
}
catch(JiBXException e)
{
throw new DictionaryException("Failed to parse System Info", e);
}
}
/**
* Create XML representation of System Info
*
* @param xml xml representation of system info
*/
public void toXML(OutputStream xml)
{
try
{
IBindingFactory factory = BindingDirectory.getFactory(SystemInfo.class);
IMarshallingContext context = factory.createMarshallingContext();
context.setIndent(4);
context.marshalDocument(this, "UTF-8", null, xml);
}
catch(JiBXException e)
{
throw new DictionaryException("Failed to create System Info", e);
}
}
}

View File

@ -0,0 +1,192 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* 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.alfresco.repo.importer.system;
import java.io.InputStream;
import java.util.List;
import javax.transaction.UserTransaction;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.view.ImporterException;
import org.alfresco.service.transaction.TransactionService;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
/**
* Repository System Information bootstrap
*
* @author davidc
*/
public class SystemInfoBootstrap implements ApplicationListener
{
// dependencies
private TransactionService transactionService;
private NodeService nodeService;
private AuthenticationComponent authenticationComponent;
private SystemExporterImporter systemImporter;
private List<String> mustNotExistStoreUrls = null;
private String bootstrapView = null;
/**
* Sets the Transaction Service
*
* @param userTransaction the transaction service
*/
public void setTransactionService(TransactionService transactionService)
{
this.transactionService = transactionService;
}
/**
* Sets the node service
*
* @param nodeService the node service
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
/**
* Set the authentication component
*
* @param authenticationComponent
*/
public void setAuthenticationComponent(AuthenticationComponent authenticationComponent)
{
this.authenticationComponent = authenticationComponent;
}
/**
* Set the System Importer
*
* @param systemImporter
*/
public void setSystemImporter(SystemExporterImporter systemImporter)
{
this.systemImporter = systemImporter;
}
/**
* If any of the store urls exist, the bootstrap does not take place
*
* @param storeUrls the list of store urls to check
*/
public void setMustNotExistStoreUrls(List<String> storeUrls)
{
this.mustNotExistStoreUrls = storeUrls;
}
/**
* Set the bootstrap view containing the system information
*
* @param bootstrapView
*/
public void setBootstrapView(String bootstrapView)
{
this.bootstrapView = bootstrapView;
}
/**
* Bootstrap
*/
public void bootstrap()
{
UserTransaction userTransaction = transactionService.getUserTransaction();
authenticationComponent.setSystemUserAsCurrentUser();
try
{
userTransaction.begin();
// check the repository exists, create if it doesn't
if (performBootstrap())
{
InputStream viewStream = getClass().getClassLoader().getResourceAsStream(bootstrapView);
if (viewStream == null)
{
throw new ImporterException("Could not find system info file " + bootstrapView);
}
try
{
systemImporter.importSystem(viewStream);
}
finally
{
viewStream.close();
}
}
userTransaction.commit();
}
catch(Throwable e)
{
// rollback the transaction
try { if (userTransaction != null) {userTransaction.rollback();} } catch (Exception ex) {}
try {authenticationComponent.clearCurrentSecurityContext(); } catch (Exception ex) {}
throw new AlfrescoRuntimeException("System Info Bootstrap failed", e);
}
finally
{
authenticationComponent.clearCurrentSecurityContext();
}
}
/**
* Determine if bootstrap should take place
*
* @return true => yes, it should
*/
private boolean performBootstrap()
{
if (bootstrapView == null || bootstrapView.length() == 0)
{
return false;
}
if (mustNotExistStoreUrls != null)
{
for (String storeUrl : mustNotExistStoreUrls)
{
StoreRef storeRef = new StoreRef(storeUrl);
if (nodeService.exists(storeRef))
{
return false;
}
}
}
return true;
}
/*
* (non-Javadoc)
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
*/
public void onApplicationEvent(ApplicationEvent event)
{
if (event instanceof ContextRefreshedEvent)
{
bootstrap();
}
}
}

View File

@ -0,0 +1,29 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* 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.alfresco.repo.importer.system;
/**
* Data holder of Version information to be exported and imported
*
* @author davidc
*/
public class VersionCounterInfo
{
public String storeRef = null;
public Integer count = null;
}

View File

@ -0,0 +1,36 @@
<binding>
<!-- <format type="java.util.Date" serializer="org.alfresco.repo.dictionary.M2XML.serialiseDate" deserializer="org.alfresco.repo.dictionary.M2XML.deserialiseDate"/> -->
<mapping name="system-info" class="org.alfresco.repo.importer.system.SystemInfo">
<structure name="patches">
<collection field="patches" factory="org.alfresco.repo.dictionary.M2Model.createList">
<structure name="patch" type="org.alfresco.repo.importer.system.PatchInfo" usage="optional">
<value name="id" field="id"/>
<value name="description" field="description"/>
<value name="fixes-from-schema" field="fixesFromSchema"/>
<value name="fixes-to-schema" field="fixesToSchema"/>
<value name="target-schema" field="targetSchema"/>
<value name="applied-to-schema" field="appliedToSchema"/>
<value name="applied-to-server" field="appliedToServer"/>
<value name="applied-on-date" field="appliedOnDate"/>
<value name="was-executed" field="wasExecuted"/>
<value name="succeeded" field="succeeded"/>
<value name="report" field="report"/>
</structure>
</collection>
</structure>
<structure name="version-store">
<collection field="versionCounters" factory="org.alfresco.repo.dictionary.M2Model.createList">
<structure name="counter" type="org.alfresco.repo.importer.system.VersionCounterInfo" usage="optional">
<value name="store-ref" field="storeRef"/>
<value name="count" field="count"/>
</structure>
</collection>
</structure>
</mapping>
</binding>

View File

@ -1206,24 +1206,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest
return assocRef; return assocRef;
} }
public void testAssociationToIncorrectNodeType() throws Exception
{
AssociationRef assocRef = createAssociation();
NodeRef sourceRef = assocRef.getSourceRef();
NodeRef targetRef = assocRef.getTargetRef();
QName qname = assocRef.getTypeQName();
try
{
// attempt the association in reverse
nodeService.createAssociation(sourceRef, targetRef, qname);
fail("Incorrect node type not detected");
}
catch (RuntimeException e)
{
// expected
}
}
public void testDuplicateAssociationDetection() throws Exception public void testDuplicateAssociationDetection() throws Exception
{ {
AssociationRef assocRef = createAssociation(); AssociationRef assocRef = createAssociation();

View File

@ -36,7 +36,6 @@ import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.AuthenticationService;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
@ -55,8 +54,9 @@ import org.springframework.context.ApplicationContext;
*/ */
public class ArchiveAndRestoreTest extends TestCase public class ArchiveAndRestoreTest extends TestCase
{ {
private static final String USER_A = "AAAAA"; private static final String USER_A = "aaaaa";
private static final String USER_B = "BBBBB"; private static final String USER_B = "bbbbb";
private static final QName ASPECT_ATTACHABLE = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachable");
private static final QName ASPECT_ATTACHABLE = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachable"); private static final QName ASPECT_ATTACHABLE = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachable");
private static final QName ASSOC_ATTACHMENTS = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachments"); private static final QName ASSOC_ATTACHMENTS = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "attachments");
private static final QName QNAME_A = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "a"); private static final QName QNAME_A = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "a");
@ -123,11 +123,19 @@ public class ArchiveAndRestoreTest extends TestCase
// Map the work store to the archive store. This will already be wired into the NodeService. // Map the work store to the archive store. This will already be wired into the NodeService.
StoreArchiveMap archiveMap = (StoreArchiveMap) ctx.getBean("storeArchiveMap"); StoreArchiveMap archiveMap = (StoreArchiveMap) ctx.getBean("storeArchiveMap");
archiveMap.getArchiveMap().put(workStoreRef, archiveStoreRef); archiveMap.getArchiveMap().put(workStoreRef, archiveStoreRef);
TestWithUserUtils.createUser(USER_A, USER_A, workStoreRootNodeRef, nodeService, authenticationService);
TestWithUserUtils.createUser(USER_B, USER_B, workStoreRootNodeRef, nodeService, authenticationService);
// grant everyone rights to the work store // grant A and B rights to the work store
permissionService.setPermission( permissionService.setPermission(
workStoreRootNodeRef, workStoreRootNodeRef,
PermissionService.ALL_AUTHORITIES, USER_A,
PermissionService.ALL_PERMISSIONS,
true);
permissionService.setPermission(
workStoreRootNodeRef,
USER_B,
PermissionService.ALL_PERMISSIONS, PermissionService.ALL_PERMISSIONS,
true); true);
@ -137,9 +145,6 @@ public class ArchiveAndRestoreTest extends TestCase
PermissionService.ALL_AUTHORITIES, PermissionService.ALL_AUTHORITIES,
PermissionService.ALL_PERMISSIONS, PermissionService.ALL_PERMISSIONS,
true); true);
TestWithUserUtils.createUser(USER_A, USER_A, workStoreRootNodeRef, nodeService, authenticationService);
TestWithUserUtils.createUser(USER_B, USER_B, workStoreRootNodeRef, nodeService, authenticationService);
} }
finally finally
{ {
@ -335,8 +340,8 @@ public class ArchiveAndRestoreTest extends TestCase
// check that the required properties are present and correct // check that the required properties are present and correct
Map<QName, Serializable> bb_Properties = nodeService.getProperties(bb_); Map<QName, Serializable> bb_Properties = nodeService.getProperties(bb_);
Path bb_originalPath = (Path) bb_Properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH); ChildAssociationRef bb_originalParent = (ChildAssociationRef) bb_Properties.get(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
assertNotNull("Original path not stored", bb_originalPath); assertNotNull("Original parent not stored", bb_originalParent);
// restore the node // restore the node
nodeService.restoreNode(bb_, null, null, null); nodeService.restoreNode(bb_, null, null, null);

View File

@ -1071,14 +1071,20 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
public void removeAssociation(NodeRef sourceRef, NodeRef targetRef, QName assocTypeQName) public void removeAssociation(NodeRef sourceRef, NodeRef targetRef, QName assocTypeQName)
throws InvalidNodeRefException throws InvalidNodeRefException
{ {
// Invoke policy behaviours
invokeBeforeUpdateNode(sourceRef);
Node sourceNode = getNodeNotNull(sourceRef); Node sourceNode = getNodeNotNull(sourceRef);
Node targetNode = getNodeNotNull(targetRef); Node targetNode = getNodeNotNull(targetRef);
// get the association // get the association
NodeAssoc assoc = nodeDaoService.getNodeAssoc(sourceNode, targetNode, assocTypeQName); NodeAssoc assoc = nodeDaoService.getNodeAssoc(sourceNode, targetNode, assocTypeQName);
if (assoc == null)
{
// nothing to remove
return;
}
AssociationRef assocRef = assoc.getNodeAssocRef(); AssociationRef assocRef = assoc.getNodeAssocRef();
// Invoke policy behaviours
invokeBeforeUpdateNode(sourceRef);
// delete it // delete it
nodeDaoService.deleteNodeAssoc(assoc); nodeDaoService.deleteNodeAssoc(assoc);
@ -1302,7 +1308,6 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
{ {
Node node = getNodeNotNull(nodeRef); Node node = getNodeNotNull(nodeRef);
ChildAssoc primaryParentAssoc = nodeDaoService.getPrimaryParentAssoc(node); ChildAssoc primaryParentAssoc = nodeDaoService.getPrimaryParentAssoc(node);
Path primaryPath = getPath(nodeRef);
// add the aspect // add the aspect
node.getAspects().add(ContentModel.ASPECT_ARCHIVED); node.getAspects().add(ContentModel.ASPECT_ARCHIVED);
@ -1319,10 +1324,6 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC), dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC),
primaryParentAssoc.getChildAssocRef()); primaryParentAssoc.getChildAssocRef());
properties.put(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC, archivedPrimaryParentNodeRefProperty); properties.put(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC, archivedPrimaryParentNodeRefProperty);
PropertyValue archivedPrimaryPathProperty = makePropertyValue(
dictionaryService.getProperty(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH),
primaryPath);
properties.put(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH, archivedPrimaryPathProperty);
// move the node // move the node
NodeRef archiveStoreRootNodeRef = getRootNode(archiveStoreRef); NodeRef archiveStoreRootNodeRef = getRootNode(archiveStoreRef);

View File

@ -115,7 +115,7 @@ public class AssociationRef implements EntityRef, Serializable
{ {
return true; return true;
} }
if (!(o instanceof ChildAssociationRef)) if (!(o instanceof AssociationRef))
{ {
return false; return false;
} }

View File

@ -70,6 +70,7 @@ public interface RepositoryExporterService
{ {
public StoreRef storeRef; public StoreRef storeRef;
public String packageName; public String packageName;
public String mimeType;
} }
/** /**