MOB-629 - remove AVM issuer id

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13676 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2009-03-18 17:38:14 +00:00
parent a4e4ee8ef3
commit ef51318dbe
25 changed files with 4356 additions and 4869 deletions

View File

@@ -4,54 +4,6 @@
<beans> <beans>
<!-- ID Issuers. -->
<bean id="nodeIssuer" class="org.alfresco.repo.avm.Issuer" depends-on="avmDAOs" >
<property name="name">
<value>node</value>
</property>
<property name="issuerDAO">
<ref bean="issuerDAO"/>
</property>
<property name="issuerIDDAO">
<ref bean="issuerIDDAO"/>
</property>
<property name="transactionService">
<ref bean="transactionService"/>
</property>
</bean>
<bean id="layerIssuer" class="org.alfresco.repo.avm.Issuer" depends-on="avmDAOs" >
<property name="name">
<value>layer</value>
</property>
<property name="issuerDAO">
<ref bean="issuerDAO"/>
</property>
<property name="issuerIDDAO">
<ref bean="issuerIDDAO"/>
</property>
<property name="transactionService">
<ref bean="transactionService"/>
</property>
</bean>
<!-- DAOs for persistent data types -->
<bean id="issuerIDDAO" class="org.alfresco.repo.avm.hibernate.IssuerIDDAOHibernate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- Issuers are not actual entities. More like pseudo entities. -->
<bean id="issuerDAO" class="org.alfresco.repo.avm.hibernate.IssuerDAOHibernate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="avmNodeDAO" class="org.alfresco.repo.avm.hibernate.AVMNodeDAOHibernate"> <bean id="avmNodeDAO" class="org.alfresco.repo.avm.hibernate.AVMNodeDAOHibernate">
<property name="sessionFactory"> <property name="sessionFactory">
<ref bean="sessionFactory"/> <ref bean="sessionFactory"/>
@@ -113,9 +65,6 @@
</bean> </bean>
<bean id="avmDAOs" class="org.alfresco.repo.avm.AVMDAOs" factory-method="Instance"> <bean id="avmDAOs" class="org.alfresco.repo.avm.AVMDAOs" factory-method="Instance">
<property name="issuerDAO">
<ref bean="issuerDAO"/>
</property>
<property name="nodeDAO"> <property name="nodeDAO">
<ref bean="avmNodeDAO"/> <ref bean="avmNodeDAO"/>
</property> </property>
@@ -186,12 +135,6 @@
<bean id="purgeVersionTxnListener" class="org.alfresco.repo.avm.PurgeVersionTxnListener"/> <bean id="purgeVersionTxnListener" class="org.alfresco.repo.avm.PurgeVersionTxnListener"/>
<bean id="avmRepository" class="org.alfresco.repo.avm.AVMRepository"> <bean id="avmRepository" class="org.alfresco.repo.avm.AVMRepository">
<property name="nodeIssuer">
<ref bean="nodeIssuer"/>
</property>
<property name="layerIssuer">
<ref bean="layerIssuer"/>
</property>
<property name="lookupCache"> <property name="lookupCache">
<ref bean="lookupCache"/> <ref bean="lookupCache"/>
</property> </property>

View File

@@ -95,6 +95,7 @@
<ref bean="patch.db-V2.1-RemoveWcmSubmittedAspect" /> <ref bean="patch.db-V2.1-RemoveWcmSubmittedAspect" />
<ref bean="patch.db-V2.1-AuditPathIndex" /> <ref bean="patch.db-V2.1-AuditPathIndex" />
<ref bean="patch.db-V3.0-0-CreateActivitiesExtras" /> <ref bean="patch.db-V3.0-0-CreateActivitiesExtras" />
<ref bean="patch.db-V3.2-Remove-AVM-Issuer" />
</list> </list>
</property> </property>
</bean> </bean>
@@ -118,12 +119,6 @@
<!-- Bootstrap the AVM --> <!-- Bootstrap the AVM -->
<bean id="avmBootstrap" class="org.alfresco.repo.avm.AvmBootstrap" > <bean id="avmBootstrap" class="org.alfresco.repo.avm.AvmBootstrap" >
<property name="issuers">
<list>
<ref bean="nodeIssuer" />
<ref bean="layerIssuer" />
</list>
</property>
<property name="avmLockingAwareService"> <property name="avmLockingAwareService">
<ref bean="avmLockingAwareService"/> <ref bean="avmLockingAwareService"/>
</property> </property>

View File

@@ -0,0 +1,53 @@
--
-- Title: Upgrade to V3.2 - Remove AVM Issuer
-- Database: MySQL
-- Since: V3.2 schema X
-- Author: janv
--
-- remove AVM node issuer - replace with auto-increment id
--
-- Please contact support@alfresco.com if you need assistance with the upgrade.
--
-- -----------------------------
-- Enable auto-increment --
-- -----------------------------
insert into avm_nodes
select
(select max(id)+1 from avm_nodes),
class_type, vers, version_id, guid, creator, owner, lastModifier, createDate, modDate, accessDate, is_root, store_new_id, acl_id, deletedType, layer_id, indirection, indirection_version, primary_indirection, opacity, content_url, mime_type, encoding, length
from avm_nodes where id = 0;
update avm_aspects set node_id = (select max(id) from avm_nodes) where node_id = 0;
update avm_child_entries set parent_id = (select max(id) from avm_nodes) where parent_id = 0;
update avm_child_entries set child_id = (select max(id) from avm_nodes) where child_id = 0;
update avm_history_links set ancestor = (select max(id) from avm_nodes) where ancestor = 0;
update avm_history_links set descendent = (select max(id) from avm_nodes) where descendent = 0;
update avm_merge_links set mfrom = (select max(id) from avm_nodes) where mfrom = 0;
update avm_merge_links set mto = (select max(id) from avm_nodes) where mto = 0;
update avm_node_properties set node_id = (select max(id) from avm_nodes) where node_id = 0;
update avm_stores set current_root_id = (select max(id) from avm_nodes) where current_root_id = 0;
update avm_version_roots set root_id = (select max(id) from avm_nodes) where root_id = 0;
delete from avm_nodes where id = 0;
alter table avm_nodes modify column id bigint not null auto_increment;
--
-- Record script finish
--
DELETE FROM alf_applied_patch WHERE id = 'patch.db-V3.2-Remove-AVM-Issuer';
INSERT INTO alf_applied_patch
(id, description, fixes_from_schema, fixes_to_schema, applied_to_schema, target_schema, applied_on_date, applied_to_server, was_executed, succeeded, report)
VALUES
(
'patch.db-V3.2-Remove-AVM-Issuer', 'Manually executed script upgrade V3.2 to remove AVM Issuer',
0, 2007, -1, 2008, null, 'UNKOWN', 1, 1, 'Script completed'
);

View File

@@ -1759,5 +1759,15 @@
</property> </property>
</bean> </bean>
<bean id="patch.db-V3.2-Remove-AVM-Issuer" class="org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch" parent="basePatch">
<property name="id"><value>patch.db-V3.2-Remove-AVM-Issuer</value></property>
<property name="description"><value>patch.schemaUpgradeScript.description</value></property>
<property name="fixesFromSchema"><value>0</value></property>
<property name="fixesToSchema"><value>2007</value></property>
<property name="targetSchema"><value>2008</value></property>
<property name="scriptUrl">
<value>classpath:alfresco/dbscripts/upgrade/3.2/${db.script.dialect}/remove-AVM-issuer.sql</value>
</property>
</bean>
</beans> </beans>

View File

@@ -19,4 +19,4 @@ version.build=@build-number@
# Schema number # Schema number
version.schema=2007 version.schema=2008

View File

@@ -1,6 +1,26 @@
/** /*
* * Copyright (C) 2005-2009 Alfresco Software Limited.
*/ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */
package org.alfresco.repo.avm; package org.alfresco.repo.avm;
import org.alfresco.repo.attributes.AttributeDAO; import org.alfresco.repo.attributes.AttributeDAO;
@@ -34,11 +54,6 @@ public class AVMDAOs
return fgInstance; return fgInstance;
} }
/**
* The IssuerDAO.
*/
public IssuerDAO fIssuerDAO;
/** /**
* The AVMNodeDAO. * The AVMNodeDAO.
*/ */
@@ -141,14 +156,6 @@ public class AVMDAOs
{ {
fVersionRootDAO = versionRootDAO; fVersionRootDAO = versionRootDAO;
} }
/**
* @param issuerDAO the fIssuerDAO to set
*/
public void setIssuerDAO(IssuerDAO issuerDAO)
{
fIssuerDAO = issuerDAO;
}
public void setAvmStorePropertyDAO(AVMStorePropertyDAO avmStorePropertyDAO) public void setAvmStorePropertyDAO(AVMStorePropertyDAO avmStorePropertyDAO)
{ {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -429,7 +429,9 @@ public class AVMStoreImpl implements AVMStore, Serializable
else else
{ {
// Otherwise we issue a brand new layer id. // Otherwise we issue a brand new layer id.
newDir.setLayerID(fAVMRepository.issueLayerID());
// note: re-use generated node id as a layer id
newDir.setLayerID(newDir.getId());
} }
if (child != null) if (child != null)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2008 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -24,7 +24,6 @@
*/ */
package org.alfresco.repo.avm; package org.alfresco.repo.avm;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
@@ -43,8 +42,6 @@ import org.springframework.context.ApplicationEvent;
*/ */
public class AvmBootstrap extends AbstractLifecycleBean public class AvmBootstrap extends AbstractLifecycleBean
{ {
private List<Issuer> issuers;
private AVMLockingAwareService avmLockingAwareService; private AVMLockingAwareService avmLockingAwareService;
private AVMRepository avmRepository; private AVMRepository avmRepository;
@@ -56,7 +53,6 @@ public class AvmBootstrap extends AbstractLifecycleBean
public AvmBootstrap() public AvmBootstrap()
{ {
issuers = new ArrayList<Issuer>(0);
} }
public void setAvmLockingAwareService(AVMLockingAwareService service) public void setAvmLockingAwareService(AVMLockingAwareService service)
@@ -79,26 +75,12 @@ public class AvmBootstrap extends AbstractLifecycleBean
avmSyncService = service; avmSyncService = service;
} }
/**
* Provide a list of {@link Issuer issuers} to bootstrap on context initialization.
*
* @see #onBootstrap(ApplicationEvent)
*/
public void setIssuers(List<Issuer> issuers)
{
this.issuers = issuers;
}
/** /**
* Initialize the issuers. * Initialize the issuers.
*/ */
@Override @Override
protected void onBootstrap(ApplicationEvent event) protected void onBootstrap(ApplicationEvent event)
{ {
for (Issuer issuer : issuers)
{
issuer.init();
}
avmLockingAwareService.init(); avmLockingAwareService.init();
avmRepository.setPermissionService(permissionService); avmRepository.setPermissionService(permissionService);
avmSyncService.setPermissionService(permissionService); avmSyncService.setPermissionService(permissionService);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -49,20 +49,18 @@ public class DeletedNodeImpl extends AVMNodeImpl implements DeletedNode
/** /**
* Create a new one from scratch. * Create a new one from scratch.
* @param id The node id.
* @param store The store it's being created in. * @param store The store it's being created in.
*/ */
public DeletedNodeImpl(long id, public DeletedNodeImpl(AVMStore store, DbAccessControlList acl)
AVMStore store, DbAccessControlList acl)
{ {
super(id, store); super(store);
this.setAcl(acl); this.setAcl(acl);
} }
public DeletedNodeImpl(DeletedNode other, public DeletedNodeImpl(DeletedNode other,
AVMStore store, Long parentAcl, ACLCopyMode mode) AVMStore store, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
AVMDAOs.Instance().fAVMNodeDAO.save(this); AVMDAOs.Instance().fAVMNodeDAO.save(this);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
copyProperties(other); copyProperties(other);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -44,12 +44,11 @@ abstract class DirectoryNodeImpl extends AVMNodeImpl implements DirectoryNode
/** /**
* A pass through constructor. Called when a new concrete subclass * A pass through constructor. Called when a new concrete subclass
* instance is created. * instance is created.
* @param id
* @param repo * @param repo
*/ */
protected DirectoryNodeImpl(long id, AVMStore repo) protected DirectoryNodeImpl(AVMStore repo)
{ {
super(id, repo); super(repo);
} }
/** /**

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -23,7 +23,6 @@
package org.alfresco.repo.avm; package org.alfresco.repo.avm;
import org.alfresco.repo.domain.DbAccessControlList;
/** /**
* Base class for file objects. * Base class for file objects.
@@ -40,11 +39,10 @@ abstract class FileNodeImpl extends AVMNodeImpl implements FileNode
/** /**
* Pass through constructor. * Pass through constructor.
* @param id The newly assigned object id.
* @param store The AVMStore we belong to. * @param store The AVMStore we belong to.
*/ */
public FileNodeImpl(long id, AVMStore store) public FileNodeImpl(AVMStore store)
{ {
super(id, store); super(store);
} }
} }

View File

@@ -1,182 +0,0 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */
package org.alfresco.repo.avm;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.transaction.TransactionService;
/**
* This is a helper class that knows how to issue identifiers.
*
* @author britt
*/
public class Issuer
{
/**
* How large a block of ids to grab at a time.
*/
private static final int BLOCK_SIZE = 100;
/**
* The next number to issue.
*/
private long fNext;
private long fLast;
/**
* The name of this issuer.
*/
private String fName;
private IssuerIDDAO fIDDAO;
private IssuerDAO fIssuerDAO;
private TransactionService fTxnService;
/**
* Default constructor.
*/
public Issuer()
{
fNext = 0;
fLast = 0;
}
public void setIssuerIDDAO(IssuerIDDAO dao)
{
fIDDAO = dao;
}
public void setIssuerDAO(IssuerDAO dao)
{
fIssuerDAO = dao;
}
public void setTransactionService(TransactionService service)
{
fTxnService = service;
}
public void init()
{
if (!fTxnService.isReadOnly())
{
fTxnService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Object>()
{
public Object execute()
{
IssuerID issuerID = fIDDAO.get(fName);
Long id = fIssuerDAO.getIssuerValue(fName);
if (issuerID == null || id == null || id >= issuerID.getNext())
{
if (id == null)
{
id = 0L;
}
else
{
id = id + 1L;
}
if (issuerID == null)
{
issuerID = new IssuerIDImpl(fName, id);
fIDDAO.save(issuerID);
}
else
{
issuerID.setNext(id);
}
}
return null;
}
});
}
}
/**
* Set the name of this issuer. For Spring.
*
* @param name
* The name to set.
*/
public void setName(String name)
{
fName = name;
}
/**
* Issue the next number.
*
* @return A serial number.
*/
public synchronized long issue()
{
if (fNext >= fLast)
{
BlockGetter getter = new BlockGetter();
Thread thread = new Thread(getter);
thread.start();
try
{
thread.join();
}
catch (InterruptedException e)
{
// Do nothing.
}
fNext = getter.fNext;
fLast = getter.fLast;
}
return fNext++;
}
private class BlockGetter implements Runnable
{
public long fNext;
public long fLast;
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
public void run()
{
fTxnService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Object>()
{
public Object execute()
{
IssuerID isID = fIDDAO.get(fName);
fNext = isID.getNext();
fLast = fNext + BLOCK_SIZE;
isID.setNext(fLast);
return null;
}
});
}
}
}

View File

@@ -1,38 +0,0 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */
package org.alfresco.repo.avm;
/**
* DAO for Issuers.
* @author britt
*/
public interface IssuerDAO
{
/**
* Get the Issuer value.
* @param The name of the issuer.
* @return The largest id issued by the named issuer.
*/
public Long getIssuerValue(String name);
}

View File

@@ -1,29 +0,0 @@
/**
*
*/
package org.alfresco.repo.avm;
/**
* Trivial interface for accessing issuer ids.
* @author britt
*/
public interface IssuerID
{
/**
* Get the name of the issuer.
* @return
*/
public String getIssuer();
/**
* Get the highest id.
* @return
*/
public long getNext();
/**
* Set the next id to be issued.
* @param next The next id to be issued.
*/
public void setNext(long next);
}

View File

@@ -1,24 +0,0 @@
/**
*
*/
package org.alfresco.repo.avm;
/**
* DAO interface for IssuerIDs.
* @author britt
*/
public interface IssuerIDDAO
{
/**
* Get one by name (primary key).
* @param name
* @return
*/
public IssuerID get(String name);
/**
* Save one.
* @param issuerID
*/
public void save(IssuerID issuerID);
}

View File

@@ -1,66 +0,0 @@
/**
*
*/
package org.alfresco.repo.avm;
/**
* Bean for issuer id tracking.
* @author britt
*/
public class IssuerIDImpl implements IssuerID
{
private String fIssuer;
private long fNext;
private long fVersion;
public IssuerIDImpl()
{
}
public IssuerIDImpl(String issuer, long next)
{
fIssuer = issuer;
fNext = next;
}
public void setVersion(long version)
{
fVersion = version;
}
public long getVersion()
{
return fVersion;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.IssuerID#getIssuer()
*/
public String getIssuer()
{
return fIssuer;
}
public void setIssuer(String issuer)
{
fIssuer = issuer;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.IssuerID#getNext()
*/
public long getNext()
{
return fNext;
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.IssuerID#setNext(long)
*/
public void setNext(long next)
{
fNext = next;
}
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -95,7 +95,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
*/ */
public LayeredDirectoryNodeImpl(String indirection, AVMStore store, AVMNode toCopy, Long parentAcl, ACLCopyMode mode) public LayeredDirectoryNodeImpl(String indirection, AVMStore store, AVMNode toCopy, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
fLayerID = -1; fLayerID = -1;
fIndirection = indirection; fIndirection = indirection;
fIndirectionVersion = -1; fIndirectionVersion = -1;
@@ -159,7 +159,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
*/ */
public LayeredDirectoryNodeImpl(LayeredDirectoryNode other, AVMStore repos, Lookup lookup, boolean copyAll, Long parentAcl, ACLCopyMode mode) public LayeredDirectoryNodeImpl(LayeredDirectoryNode other, AVMStore repos, Lookup lookup, boolean copyAll, Long parentAcl, ACLCopyMode mode)
{ {
super(repos.getAVMRepository().issueID(), repos); super(repos);
fIndirection = other.getIndirection(); fIndirection = other.getIndirection();
fPrimaryIndirection = other.getPrimaryIndirection(); fPrimaryIndirection = other.getPrimaryIndirection();
fIndirectionVersion = -1; fIndirectionVersion = -1;
@@ -201,7 +201,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
*/ */
public LayeredDirectoryNodeImpl(PlainDirectoryNode other, AVMStore store, Lookup lPath, boolean copyContents, Long parentAcl, ACLCopyMode mode) public LayeredDirectoryNodeImpl(PlainDirectoryNode other, AVMStore store, Lookup lPath, boolean copyContents, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
fIndirection = null; fIndirection = null;
fPrimaryIndirection = false; fPrimaryIndirection = false;
fIndirectionVersion = -1; fIndirectionVersion = -1;
@@ -240,7 +240,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
*/ */
public LayeredDirectoryNodeImpl(DirectoryNode dir, AVMStore store, Lookup srcLookup, String name, Long inheritedAcl, ACLCopyMode mode) public LayeredDirectoryNodeImpl(DirectoryNode dir, AVMStore store, Lookup srcLookup, String name, Long inheritedAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
fIndirection = srcLookup.getIndirectionPath() + "/" + name; fIndirection = srcLookup.getIndirectionPath() + "/" + name;
fPrimaryIndirection = true; fPrimaryIndirection = true;
fIndirectionVersion = -1; fIndirectionVersion = -1;
@@ -793,7 +793,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
if (child != null && (indirect || child.getStoreNew() == null || child.getAncestor() != null)) if (child != null && (indirect || child.getStoreNew() == null || child.getAncestor() != null))
{ {
DeletedNodeImpl ghost = new DeletedNodeImpl(lPath.getAVMStore().getAVMRepository().issueID(), lPath.getAVMStore(), child.getAcl()); DeletedNodeImpl ghost = new DeletedNodeImpl(lPath.getAVMStore(), child.getAcl());
AVMDAOs.Instance().fAVMNodeDAO.save(ghost); AVMDAOs.Instance().fAVMNodeDAO.save(ghost);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
ghost.setAncestor(child); ghost.setAncestor(child);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -66,7 +66,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
*/ */
public LayeredFileNodeImpl(LayeredFileNode other, AVMStore store, Long parentAcl, ACLCopyMode mode) public LayeredFileNodeImpl(LayeredFileNode other, AVMStore store, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
fIndirection = other.getIndirection(); fIndirection = other.getIndirection();
fIndirectionVersion = -1; fIndirectionVersion = -1;
setVersionID(other.getVersionID() + 1); setVersionID(other.getVersionID() + 1);
@@ -88,7 +88,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
*/ */
public LayeredFileNodeImpl(String indirection, AVMStore store, DbAccessControlList acl) public LayeredFileNodeImpl(String indirection, AVMStore store, DbAccessControlList acl)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
fIndirection = indirection; fIndirection = indirection;
fIndirectionVersion = -1; fIndirectionVersion = -1;
setVersionID(1); setVersionID(1);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -52,7 +52,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
*/ */
public PlainDirectoryNodeImpl(AVMStore store) public PlainDirectoryNodeImpl(AVMStore store)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
setVersionID(1); setVersionID(1);
AVMDAOs.Instance().fAVMNodeDAO.save(this); AVMDAOs.Instance().fAVMNodeDAO.save(this);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
@@ -74,7 +74,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
public PlainDirectoryNodeImpl(PlainDirectoryNode other, public PlainDirectoryNodeImpl(PlainDirectoryNode other,
AVMStore store, Long parentAcl, ACLCopyMode mode) AVMStore store, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
AVMDAOs.Instance().fAVMNodeDAO.save(this); AVMDAOs.Instance().fAVMNodeDAO.save(this);
for (ChildEntry child : AVMDAOs.Instance().fChildEntryDAO.getByParent(other, null)) for (ChildEntry child : AVMDAOs.Instance().fChildEntryDAO.getByParent(other, null))
{ {
@@ -295,8 +295,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
AVMDAOs.Instance().fChildEntryDAO.delete(entry); AVMDAOs.Instance().fChildEntryDAO.delete(entry);
if (child.getStoreNew() == null || child.getAncestor() != null) if (child.getStoreNew() == null || child.getAncestor() != null)
{ {
DeletedNodeImpl ghost = new DeletedNodeImpl(lPath.getAVMStore().getAVMRepository().issueID(), DeletedNodeImpl ghost = new DeletedNodeImpl(lPath.getAVMStore(), child.getAcl());
lPath.getAVMStore(), child.getAcl());
AVMDAOs.Instance().fAVMNodeDAO.save(ghost); AVMDAOs.Instance().fAVMNodeDAO.save(ghost);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
ghost.setAncestor(child); ghost.setAncestor(child);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2007 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -79,7 +79,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
*/ */
public PlainFileNodeImpl(AVMStore store) public PlainFileNodeImpl(AVMStore store)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
setVersionID(1); setVersionID(1);
AVMDAOs.Instance().fAVMNodeDAO.save(this); AVMDAOs.Instance().fAVMNodeDAO.save(this);
AVMDAOs.Instance().fAVMNodeDAO.flush(); AVMDAOs.Instance().fAVMNodeDAO.flush();
@@ -93,7 +93,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
public PlainFileNodeImpl(PlainFileNode other, public PlainFileNodeImpl(PlainFileNode other,
AVMStore store, Long parentAcl, ACLCopyMode mode) AVMStore store, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
// The null is OK because the Lookup argument is only use by // The null is OK because the Lookup argument is only use by
// layered files. // layered files.
setContentData(other.getContentData(null)); setContentData(other.getContentData(null));
@@ -123,7 +123,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
DbAccessControlList acl, DbAccessControlList acl,
int versionID, Long parentAcl, ACLCopyMode mode) int versionID, Long parentAcl, ACLCopyMode mode)
{ {
super(store.getAVMRepository().issueID(), store); super(store);
setContentData(content); setContentData(content);
setBasicAttributes(attrs); setBasicAttributes(attrs);
setVersionID(versionID + 1); setVersionID(versionID + 1);

View File

@@ -1,380 +1,376 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.alfresco.repo.avm"> <hibernate-mapping package="org.alfresco.repo.avm">
<typedef class="org.alfresco.repo.domain.hibernate.QNameUserType" name="QName" /> <typedef class="org.alfresco.repo.domain.hibernate.QNameUserType" name="QName" />
<!-- AVMNodeBean is the abstract base for filesystem like objects. <!-- AVMNodeBean is the abstract base for filesystem like objects.
We're using the one table per class hierarchy strategy to implement We're using the one table per class hierarchy strategy to implement
polymorphism. --> polymorphism. -->
<class table="avm_nodes" abstract="true" <class table="avm_nodes" abstract="true"
name="AVMNodeImpl" name="AVMNodeImpl"
proxy="AVMNode" proxy="AVMNode"
optimistic-lock="version" optimistic-lock="version"
lazy="false"> lazy="false">
<cache usage="read-write"/> <cache usage="read-write"/>
<!-- The id is set programmatically using an Issuer. See below. -->
<id name="id" <id name="id" column="id" type="long">
column="id" <generator class="native"/>
type="long"/> </id>
<!-- I suppose this would be more efficient to encode type by an int.
We'll see if using a string makes a difference. --> <!-- I suppose this would be more efficient to encode type by an int.
<discriminator column="class_type" We'll see if using a string makes a difference. -->
type="string" <discriminator column="class_type"
length="20"/> type="string"
<!-- We're using hibernate's own versioning scheme for concurrency control. length="20"/>
I don't know how well that will play with a full Spring-JTA stack. --> <!-- We're using hibernate's own versioning scheme for concurrency control.
<version column="vers" I don't know how well that will play with a full Spring-JTA stack. -->
name="vers" <version column="vers"
type="long"/> name="vers"
<!-- This should really be not null, but I haven't figured out type="long"/>
the right way to build the relation so that nullability constraints <!-- This should really be not null, but I haven't figured out
won't cause violations in the db during saves. --> the right way to build the relation so that nullability constraints
<property name="versionID" type="int" column="version_id" won't cause violations in the db during saves. -->
not-null="true"/> <property name="versionID" type="int" column="version_id"
<property name="guid" type="string" length="36" column="guid"/> not-null="true"/>
<component name="basicAttributes" class="BasicAttributesImpl"> <property name="guid" type="string" length="36" column="guid"/>
<property name="creator" type="string" not-null="true"/> <component name="basicAttributes" class="BasicAttributesImpl">
<property name="owner" type="string" not-null="true"/> <property name="creator" type="string" not-null="true"/>
<property name="lastModifier" type="string" not-null="true"/> <property name="owner" type="string" not-null="true"/>
<property name="createDate" type="long" not-null="true"/> <property name="lastModifier" type="string" not-null="true"/>
<property name="modDate" type="long" not-null="true"/> <property name="createDate" type="long" not-null="true"/>
<property name="accessDate" type="long" not-null="true"/> <property name="modDate" type="long" not-null="true"/>
</component> <property name="accessDate" type="long" not-null="true"/>
<property name="isRoot" column="is_root" type="boolean"/> </component>
<many-to-one name="storeNew" class="AVMStoreImpl" column="store_new_id" foreign-key="fk_avm_n_store"/> <property name="isRoot" column="is_root" type="boolean"/>
<!-- ACL --> <many-to-one name="storeNew" class="AVMStoreImpl" column="store_new_id" foreign-key="fk_avm_n_store"/>
<many-to-one name="acl" column="acl_id" foreign-key="fk_avm_n_acl" cascade="none" <!-- ACL -->
class="org.alfresco.repo.domain.hibernate.DbAccessControlListImpl"/> <many-to-one name="acl" column="acl_id" foreign-key="fk_avm_n_acl" cascade="none"
<set name="aspects" fetch="join" lazy="false" table="avm_aspects" cascade="all" optimistic-lock="true"> class="org.alfresco.repo.domain.hibernate.DbAccessControlListImpl"/>
<cache usage="read-write"/> <set name="aspects" fetch="join" lazy="false" table="avm_aspects" cascade="all" optimistic-lock="true">
<key column="node_id" not-null="true" foreign-key="fk_avm_nasp_n"/> <cache usage="read-write"/>
<element column="qname_id" type="long" not-null="true"/> <!-- fk_avm_nasp_qn --> <key column="node_id" not-null="true" foreign-key="fk_avm_nasp_n"/>
</set> <element column="qname_id" type="long" not-null="true"/> <!-- fk_avm_nasp_qn -->
<map name="properties" fetch="join" lazy="false" table="avm_node_properties" cascade="all" optimistic-lock="true"> </set>
<cache usage="read-write"/> <map name="properties" fetch="join" lazy="false" table="avm_node_properties" cascade="all" optimistic-lock="true">
<key column="node_id" not-null="true" foreign-key="fk_avm_nprop_n"/> <cache usage="read-write"/>
<map-key column="qname_id" type="long" /> <!-- fk_avm_nprop_qn --> <key column="node_id" not-null="true" foreign-key="fk_avm_nprop_n"/>
<composite-element class="org.alfresco.repo.domain.PropertyValue"> <map-key column="qname_id" type="long" /> <!-- fk_avm_nprop_qn -->
<property name="actualType" column="actual_type_n" type="integer" not-null="true" /> <composite-element class="org.alfresco.repo.domain.PropertyValue">
<property name="persistedType" column="persisted_type_n" type="integer" not-null="true" /> <property name="actualType" column="actual_type_n" type="integer" not-null="true" />
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" /> <property name="persistedType" column="persisted_type_n" type="integer" not-null="true" />
<property name="booleanValue" column="boolean_value" type="boolean" /> <property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
<property name="longValue" column="long_value" type="long" /> <property name="booleanValue" column="boolean_value" type="boolean" />
<property name="floatValue" column="float_value" type="float" /> <property name="longValue" column="long_value" type="long" />
<property name="doubleValue" column="double_value" type="double" /> <property name="floatValue" column="float_value" type="float" />
<property name="stringValue" column="string_value" type="string" length="1024"/> <property name="doubleValue" column="double_value" type="double" />
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/> <property name="stringValue" column="string_value" type="string" length="1024"/>
</composite-element> <property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
</map> </composite-element>
<!-- Deleted nodes --> </map>
<subclass name="DeletedNodeImpl" <!-- Deleted nodes -->
proxy="DeletedNode" <subclass name="DeletedNodeImpl"
lazy="false" proxy="DeletedNode"
discriminator-value="deletednode"> lazy="false"
<property name="deletedType" type="int"/> discriminator-value="deletednode">
</subclass> <property name="deletedType" type="int"/>
<!-- Directories, two flavors. --> </subclass>
<subclass name="DirectoryNodeImpl" <!-- Directories, two flavors. -->
proxy="DirectoryNode" <subclass name="DirectoryNodeImpl"
abstract="true" proxy="DirectoryNode"
lazy="false"> abstract="true"
<!-- A Layered Directory is our smart symlink thingy. --> lazy="false">
<subclass name="LayeredDirectoryNodeImpl" <!-- A Layered Directory is our smart symlink thingy. -->
proxy="LayeredDirectoryNode" <subclass name="LayeredDirectoryNodeImpl"
discriminator-value="layereddirectory" lazy="false"> proxy="LayeredDirectoryNode"
<!-- The layer id is an implementation trick to disambiguate discriminator-value="layereddirectory" lazy="false">
exactly what layer is being refered to in various circumstances. --> <!-- The layer id is an implementation trick to disambiguate
<property name="layerID" column="layer_id" type="long"/> exactly what layer is being refered to in various circumstances. -->
<!-- The is the moral equivalent of the value of a symlink. --> <property name="layerID" column="layer_id" type="long"/>
<property name="indirection" column="indirection" <!-- The is the moral equivalent of the value of a symlink. -->
type="string" length="511" /> <property name="indirection" column="indirection"
<property name="indirectionVersion" type="int" column="indirection_version"/> type="string" length="511" />
<!-- This marks a layered directory as either knowing itself what <property name="indirectionVersion" type="int" column="indirection_version"/>
it points at (true) or inheriting what it points at from its <!-- This marks a layered directory as either knowing itself what
container (false). it points at (true) or inheriting what it points at from its
Ideally we would have the column 'indirection' in the index but it is too long. container (false).
--> Ideally we would have the column 'indirection' in the index but it is too long.
<property name="primaryIndirection" -->
column="primary_indirection" type="boolean" index="idx_avm_n_pi" /> <property name="primaryIndirection"
<property name="opacity" column="opacity" type="boolean"/> column="primary_indirection" type="boolean" index="idx_avm_n_pi" />
<!-- Map of names to DirectoryEntries. --> <property name="opacity" column="opacity" type="boolean"/>
</subclass> <!-- Map of names to DirectoryEntries. -->
<!-- Just plain directories. --> </subclass>
<subclass name="PlainDirectoryNodeImpl" <!-- Just plain directories. -->
discriminator-value="plaindirectory" proxy="PlainDirectoryNode" lazy="false"> <subclass name="PlainDirectoryNodeImpl"
</subclass> discriminator-value="plaindirectory" proxy="PlainDirectoryNode" lazy="false">
</subclass> </subclass>
<!-- There are two kinds of files, plain and symlinky. --> </subclass>
<subclass name="FileNodeImpl" <!-- There are two kinds of files, plain and symlinky. -->
proxy="FileNode" <subclass name="FileNodeImpl"
abstract="true" proxy="FileNode"
lazy="false"> abstract="true"
<!-- Plain files just have a reference to a Content object. --> lazy="false">
<subclass discriminator-value="plainfile" <!-- Plain files just have a reference to a Content object. -->
name="PlainFileNodeImpl" proxy="PlainFileNode" lazy="false"> <subclass discriminator-value="plainfile"
<property name="contentURL" column="content_url" type="string" length="128"/> name="PlainFileNodeImpl" proxy="PlainFileNode" lazy="false">
<property name="mimeType" column="mime_type" type="string" length="64"/> <property name="contentURL" column="content_url" type="string" length="128"/>
<property name="encoding" column="encoding" type="string" length="16"/> <property name="mimeType" column="mime_type" type="string" length="64"/>
<property name="length" column="length" type="long"/> <property name="encoding" column="encoding" type="string" length="16"/>
</subclass> <property name="length" column="length" type="long"/>
<!-- Layered files are almost exactly copy on write symlinks. --> </subclass>
<subclass name="LayeredFileNodeImpl" <!-- Layered files are almost exactly copy on write symlinks. -->
discriminator-value="layeredfile" proxy="LayeredFileNode" lazy="false"> <subclass name="LayeredFileNodeImpl"
<property name="indirection" type="string" length="511" discriminator-value="layeredfile" proxy="LayeredFileNode" lazy="false">
column="indirection" /> <property name="indirection" type="string" length="511"
<property name="indirectionVersion" type="int" column="indirection_version"/> column="indirection" />
</subclass> <property name="indirectionVersion" type="int" column="indirection_version"/>
</subclass> </subclass>
</class> </subclass>
<!-- A store is the what we used to call a virtual repository. --> </class>
<class table="avm_stores" name="AVMStoreImpl" <!-- A store is the what we used to call a virtual repository. -->
proxy="AVMStore" optimistic-lock="version"> <class table="avm_stores" name="AVMStoreImpl"
<cache usage="read-write"/> proxy="AVMStore" optimistic-lock="version">
<id name="id" column="id" type="long"> <cache usage="read-write"/>
<generator class="native"/> <id name="id" column="id" type="long">
</id> <generator class="native"/>
<version name="vers" column="vers" type="long"/> </id>
<property name="name" column="name" type="string" unique="true"/> <version name="vers" column="vers" type="long"/>
<property type="int" name="nextVersionID" <property name="name" column="name" type="string" unique="true"/>
column="next_version_id" not-null="true"/> <property type="int" name="nextVersionID"
<!-- Every AVMStore has a root directory that is the current root directory. --> column="next_version_id" not-null="true"/>
<many-to-one name="root" class="DirectoryNodeImpl" <!-- Every AVMStore has a root directory that is the current root directory. -->
column="current_root_id" cascade="save-update" foreign-key="fk_avm_s_root"> <many-to-one name="root" class="DirectoryNodeImpl"
</many-to-one> column="current_root_id" cascade="save-update" foreign-key="fk_avm_s_root">
<!-- ACL --> </many-to-one>
<many-to-one name="storeAcl" column="acl_id" foreign-key="fk_avm_s_acl" cascade="none" <!-- ACL -->
class="org.alfresco.repo.domain.hibernate.DbAccessControlListImpl"/> <many-to-one name="storeAcl" column="acl_id" foreign-key="fk_avm_s_acl" cascade="none"
</class> class="org.alfresco.repo.domain.hibernate.DbAccessControlListImpl"/>
<class name="AVMStorePropertyImpl" proxy="AVMStoreProperty" table="avm_store_properties"> </class>
<id name="id" column="id" type="long"> <class name="AVMStorePropertyImpl" proxy="AVMStoreProperty" table="avm_store_properties">
<generator class="native"/> <id name="id" column="id" type="long">
</id> <generator class="native"/>
<many-to-one name="store" class="AVMStoreImpl" column="avm_store_id" foreign-key="fk_avm_sprop_store"/> </id>
<property name="qnameId" column="qname_id" type="long" not-null="true" /> <!-- fk_avm_sprop_qname --> <many-to-one name="store" class="AVMStoreImpl" column="avm_store_id" foreign-key="fk_avm_sprop_store"/>
<component class="org.alfresco.repo.domain.PropertyValue" name="value"> <property name="qnameId" column="qname_id" type="long" not-null="true" /> <!-- fk_avm_sprop_qname -->
<property name="actualType" column="actual_type_n" type="integer" not-null="true" /> <component class="org.alfresco.repo.domain.PropertyValue" name="value">
<property name="persistedType" column="persisted_type_n" type="integer" not-null="true" /> <property name="actualType" column="actual_type_n" type="integer" not-null="true" />
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" /> <property name="persistedType" column="persisted_type_n" type="integer" not-null="true" />
<property name="booleanValue" column="boolean_value" type="boolean" /> <property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
<property name="longValue" column="long_value" type="long" /> <property name="booleanValue" column="boolean_value" type="boolean" />
<property name="floatValue" column="float_value" type="float" /> <property name="longValue" column="long_value" type="long" />
<property name="doubleValue" column="double_value" type="double" /> <property name="floatValue" column="float_value" type="float" />
<property name="stringValue" column="string_value" type="string" length="1024"/> <property name="doubleValue" column="double_value" type="double" />
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/> <property name="stringValue" column="string_value" type="string" length="1024"/>
</component> <property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
</class> </component>
<class name="VersionRootImpl" proxy="VersionRoot" table="avm_version_roots"> </class>
<cache usage="read-write"/> <class name="VersionRootImpl" proxy="VersionRoot" table="avm_version_roots">
<id name="id" column="id" type="long"> <cache usage="read-write"/>
<generator class="native"></generator> <id name="id" column="id" type="long">
</id> <generator class="native"></generator>
<natural-id> </id>
<property name="versionID" type="int" not-null="true" <natural-id>
column="version_id" index="idx_avm_vr_version"> <property name="versionID" type="int" not-null="true"
</property> column="version_id" index="idx_avm_vr_version">
<many-to-one name="avmStore" column="avm_store_id" </property>
class="AVMStoreImpl" not-null="true" foreign-key="fk_avm_vr_store"> <many-to-one name="avmStore" column="avm_store_id"
</many-to-one> class="AVMStoreImpl" not-null="true" foreign-key="fk_avm_vr_store">
</natural-id> </many-to-one>
<property name="createDate" type="long" not-null="true" column="create_date"> </natural-id>
</property> <property name="createDate" type="long" not-null="true" column="create_date">
<property name="creator" type="string" column="creator" </property>
not-null="true"> <property name="creator" type="string" column="creator"
</property> not-null="true">
<many-to-one name="root" class="DirectoryNodeImpl" </property>
column="root_id" not-null="true" foreign-key="fk_avm_vr_root"> <many-to-one name="root" class="DirectoryNodeImpl"
</many-to-one> column="root_id" not-null="true" foreign-key="fk_avm_vr_root">
<property name="tag" type="string" length="255" column="tag"/> </many-to-one>
<property name="description" type="string" length="4000" column="description"/> <property name="tag" type="string" length="255" column="tag"/>
</class> <property name="description" type="string" length="4000" column="description"/>
<class name="ChildEntryImpl" proxy="ChildEntry" table="avm_child_entries"> </class>
<cache usage="read-write"/> <class name="ChildEntryImpl" proxy="ChildEntry" table="avm_child_entries">
<composite-id name="key" class="ChildKey" > <cache usage="read-write"/>
<key-many-to-one name="parent" column="parent_id" class="DirectoryNodeImpl" foreign-key="fk_avm_ce_parent"/> <composite-id name="key" class="ChildKey" >
<key-property name="name" column="name" type="string" length="160"/> <key-many-to-one name="parent" column="parent_id" class="DirectoryNodeImpl" foreign-key="fk_avm_ce_parent"/>
</composite-id> <key-property name="name" column="name" type="string" length="160"/>
<many-to-one name="child" column="child_id" class="AVMNodeImpl" not-null="true" foreign-key="fk_avm_ce_child"/> </composite-id>
</class> <many-to-one name="child" column="child_id" class="AVMNodeImpl" not-null="true" foreign-key="fk_avm_ce_child"/>
<class name="HistoryLinkImpl" proxy="HistoryLink" table="avm_history_links"> </class>
<composite-id> <class name="HistoryLinkImpl" proxy="HistoryLink" table="avm_history_links">
<key-many-to-one name="ancestor" class="AVMNodeImpl" column="ancestor" foreign-key="fk_avm_hl_ancestor"/> <composite-id>
<key-many-to-one name="descendent" class="AVMNodeImpl" column="descendent" foreign-key="fk_avm_hl_desc"/> <key-many-to-one name="ancestor" class="AVMNodeImpl" column="ancestor" foreign-key="fk_avm_hl_ancestor"/>
</composite-id> <key-many-to-one name="descendent" class="AVMNodeImpl" column="descendent" foreign-key="fk_avm_hl_desc"/>
</class> </composite-id>
<class name="MergeLinkImpl" proxy="MergeLink" table="avm_merge_links"> </class>
<composite-id> <class name="MergeLinkImpl" proxy="MergeLink" table="avm_merge_links">
<key-many-to-one name="mfrom" class="AVMNodeImpl" column="mfrom" foreign-key="fk_avm_ml_from"/> <composite-id>
<key-many-to-one name="mto" class="AVMNodeImpl" column="mto" foreign-key="fk_avm_ml_to"/> <key-many-to-one name="mfrom" class="AVMNodeImpl" column="mfrom" foreign-key="fk_avm_ml_from"/>
</composite-id> <key-many-to-one name="mto" class="AVMNodeImpl" column="mto" foreign-key="fk_avm_ml_to"/>
</class> </composite-id>
<!-- When a snapshot is created we stow away all of the layered </class>
nodes that were frozen by the snapshot so that subsequent <!-- When a snapshot is created we stow away all of the layered
snapshots can find them and force copies. --> nodes that were frozen by the snapshot so that subsequent
<class name="VersionLayeredNodeEntryImpl" proxy="VersionLayeredNodeEntry" snapshots can find them and force copies. -->
table="avm_version_layered_node_entry"> <class name="VersionLayeredNodeEntryImpl" proxy="VersionLayeredNodeEntry"
<composite-id> table="avm_version_layered_node_entry">
<key-many-to-one name="version" class="VersionRootImpl" column="version_root_id" foreign-key="fk_avm_vlne_vr"/> <composite-id>
<key-property name="md5Sum" type="string" length="32" column="md5sum"/> <key-many-to-one name="version" class="VersionRootImpl" column="version_root_id" foreign-key="fk_avm_vlne_vr"/>
</composite-id> <key-property name="md5Sum" type="string" length="32" column="md5sum"/>
<property name="path" type="string" length="512" column="path"/> </composite-id>
</class> <property name="path" type="string" length="512" column="path"/>
</class>
<class name="IssuerIDImpl" proxy="IssuerID" table="avm_issuer_ids" optimistic-lock="version" lazy="false">
<id name="issuer" type="string" length="32" column="issuer"/> <query name="ChildEntry.DeleteByParent">
<version name="version" column="version" type="long"/> <![CDATA[
<property name="next" type="long" column="next_id" not-null="true"/> delete ChildEntryImpl ce
</class> where ce.key.parent = :parent
<query name="ChildEntry.DeleteByParent"> ]]>
<![CDATA[ </query>
delete ChildEntryImpl ce <query name="AVMNode.GetNewInStore">
where ce.key.parent = :parent <![CDATA[
]]> from AVMNodeImpl an
</query> where an.storeNew = :store
<query name="AVMNode.GetNewInStore"> ]]>
<![CDATA[ </query>
from AVMNodeImpl an <query name="AVMNode.GetNewInStoreID">
where an.storeNew = :store <![CDATA[
]]> select an.id
</query> from AVMNodeImpl an
<query name="AVMNode.GetNewInStoreID"> where an.storeNew = :store
<![CDATA[ ]]>
select an.id </query>
from AVMNodeImpl an <query name="AVMNode.ClearNewInStore">
where an.storeNew = :store <![CDATA[
]]> update versioned AVMNodeImpl an
</query> set an.storeNew = null
<query name="AVMNode.ClearNewInStore"> where an.storeNew = :store
<![CDATA[ ]]>
update versioned AVMNodeImpl an </query>
set an.storeNew = null <query name="AVMNode.GetNewLayeredDirectory">
where an.storeNew = :store <![CDATA[
]]> select an.id
</query> from LayeredDirectoryNodeImpl an
<query name="AVMNode.GetNewLayeredDirectory"> where an.storeNew = :store
<![CDATA[ ]]>
select an.id </query>
from LayeredDirectoryNodeImpl an <query name="AVMNode.GetNewLayeredFile">
where an.storeNew = :store <![CDATA[
]]> select an.id
</query> from LayeredFileNodeImpl an
<query name="AVMNode.GetNewLayeredFile"> where an.storeNew = :store
<![CDATA[ ]]>
select an.id </query>
from LayeredFileNodeImpl an <query name="AVMNode.GetDescendents">
where an.storeNew = :store <![CDATA[
]]> select hl.descendent
</query> from HistoryLinkImpl hl
<query name="AVMNode.GetDescendents"> where hl.ancestor = :node
<![CDATA[ ]]>
select hl.descendent </query>
from HistoryLinkImpl hl <query name="HistoryLink.ByAncestor">
where hl.ancestor = :node <![CDATA[
]]> from HistoryLinkImpl hl
</query> where hl.ancestor = :node
<query name="HistoryLink.ByAncestor"> ]]>
<![CDATA[ </query>
from HistoryLinkImpl hl <query name="AVMNode.GetMergedTo">
where hl.ancestor = :node <![CDATA[
]]> select ml.mto
</query> from MergeLinkImpl ml
<query name="AVMNode.GetMergedTo"> where ml.mfrom = :merged
<![CDATA[ ]]>
select ml.mto </query>
from MergeLinkImpl ml <query name="MergeLink.ByFrom">
where ml.mfrom = :merged <![CDATA[
]]> from MergeLinkImpl ml
</query> where ml.mfrom = :merged
<query name="MergeLink.ByFrom"> ]]>
<![CDATA[ </query>
from MergeLinkImpl ml <query name="VersionRoot.GetVersionRoot">
where ml.mfrom = :merged <![CDATA[
]]> select v.root
</query> from VersionRootImpl v
<query name="VersionRoot.GetVersionRoot"> where
<![CDATA[ v.avmStore = :store and v.versionID = :version
select v.root ]]>
from VersionRootImpl v </query>
where <query name="VersionRoot.VersionByID">
v.avmStore = :store and v.versionID = :version <![CDATA[
]]> from VersionRootImpl v
</query> where
<query name="VersionRoot.VersionByID"> v.avmStore = :store and v.versionID = :version
<![CDATA[ ]]>
from VersionRootImpl v </query>
where <query name="FindOrphans">
v.avmStore = :store and v.versionID = :version <![CDATA[
]]> from AVMNodeImpl an
</query> where
<query name="FindOrphans"> an not in ( select ce.child
<![CDATA[ from ChildEntryImpl ce )
from AVMNodeImpl an and an.isRoot = false
where ]]>
an not in ( select ce.child </query>
from ChildEntryImpl ce ) <query name="FindOrphans2">
and an.isRoot = false <![CDATA[
]]> select an
</query> from ChildEntryImpl ce
<query name="FindOrphans2"> right outer join ce.child an
<![CDATA[ where ce.child is null and an.isRoot = false
select an ]]>
from ChildEntryImpl ce </query>
right outer join ce.child an <query name="PlainFileNode.GetContentUrls">
where ce.child is null and an.isRoot = false <![CDATA[
]]> select
</query> pfn.contentURL
<query name="PlainFileNode.GetContentUrls"> from
<![CDATA[ PlainFileNodeImpl pfn
select where pfn.contentURL is not null
pfn.contentURL ]]>
from </query>
PlainFileNodeImpl pfn
where pfn.contentURL is not null <sql-query name="avm.GetStorePropertiesByKeyPattern">
]]> <return alias="asp" class="AVMStorePropertyImpl"/>
</query> SELECT
{asp.*}
<sql-query name="avm.GetStorePropertiesByKeyPattern"> FROM
<return alias="asp" class="AVMStorePropertyImpl"/> avm_store_properties asp
SELECT JOIN alf_qname qn ON (qn.id = asp.qname_id)
{asp.*} JOIN alf_namespace ns ON (ns.id = qn.ns_id)
FROM WHERE
avm_store_properties asp ns.uri LIKE :uri AND
JOIN alf_qname qn ON (qn.id = asp.qname_id) qn.local_name LIKE :localName
JOIN alf_namespace ns ON (ns.id = qn.ns_id) </sql-query>
WHERE
ns.uri LIKE :uri AND <sql-query name="avm.GetStorePropertiesByStoreAndKeyPattern">
qn.local_name LIKE :localName <return alias="asp" class="AVMStorePropertyImpl"/>
</sql-query> SELECT
{asp.*}
<sql-query name="avm.GetStorePropertiesByStoreAndKeyPattern"> FROM
<return alias="asp" class="AVMStorePropertyImpl"/> avm_store_properties asp
SELECT JOIN alf_qname qn ON (qn.id = asp.qname_id)
{asp.*} JOIN alf_namespace ns ON (ns.id = qn.ns_id)
FROM WHERE
avm_store_properties asp asp.avm_store_id = :storeId AND
JOIN alf_qname qn ON (qn.id = asp.qname_id) ns.uri LIKE :uri AND
JOIN alf_namespace ns ON (ns.id = qn.ns_id) qn.local_name LIKE :localName
WHERE </sql-query>
asp.avm_store_id = :storeId AND
ns.uri LIKE :uri AND <sql-query name="avm.DeleteStorePropertiesByType">
qn.local_name LIKE :localName DELETE
</sql-query> FROM
avm_store_properties
<sql-query name="avm.DeleteStorePropertiesByType"> WHERE
DELETE avm_store_id = :storeId AND
FROM qname_id = :qnameId
avm_store_properties </sql-query>
WHERE
avm_store_id = :storeId AND <sql-query name="avm.DeleteStoreProperties">
qname_id = :qnameId DELETE
</sql-query> FROM
avm_store_properties
<sql-query name="avm.DeleteStoreProperties"> WHERE
DELETE avm_store_id = :storeId
FROM </sql-query>
avm_store_properties
WHERE </hibernate-mapping>
avm_store_id = :storeId
</sql-query>
</hibernate-mapping>

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */
package org.alfresco.repo.avm.hibernate;
import org.alfresco.repo.avm.IssuerDAO;
import org.alfresco.service.cmr.avm.AVMException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* DAO for Issuers. Hibernate version.
* @author britt
*/
class IssuerDAOHibernate extends HibernateDaoSupport implements
IssuerDAO
{
/**
* Do nothing constructor.
*/
public IssuerDAOHibernate()
{
super();
}
/**
* Get the largest issued id for the named issuer.
* @param The name of the issuer.
* @return The value or null if the issuer is brand new.
* @throws AVMException on an invalid name.
*/
public Long getIssuerValue(String name)
{
if (name.equals("content"))
{
return (Long)getSession().
createQuery("select max(fc.id) from FileContentImpl fc").uniqueResult();
}
else if (name.equals("layer"))
{
return (Long)getSession().
createQuery("select max(an.layerID) from AVMNodeImpl an").uniqueResult();
}
else if (name.equals("node"))
{
return (Long)getSession().createQuery("select max(an.id) from AVMNodeImpl an").uniqueResult();
}
throw new AVMException("Unknown issuer type: " + name);
}
}

View File

@@ -1,32 +0,0 @@
/**
*
*/
package org.alfresco.repo.avm.hibernate;
import org.alfresco.repo.avm.IssuerID;
import org.alfresco.repo.avm.IssuerIDDAO;
import org.alfresco.repo.avm.IssuerIDImpl;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* Hibernate implementation of IssuerIDDAO
* @author britt
*/
public class IssuerIDDAOHibernate extends HibernateDaoSupport implements IssuerIDDAO
{
/* (non-Javadoc)
* @see org.alfresco.repo.avm.IssuerIDDAO#get(java.lang.String)
*/
public IssuerID get(String name)
{
return (IssuerID)getSession().get(IssuerIDImpl.class, name);
}
/* (non-Javadoc)
* @see org.alfresco.repo.avm.IssuerIDDAO#save(org.alfresco.repo.avm.IssuerID)
*/
public void save(IssuerID issuerID)
{
getSession().save(issuerID);
}
}