Changeset 19581


Ignore:
Timestamp:
01/30/12 13:40:24 (4 months ago)
Author:
sys
Message:
  • Ajout ValueRevLinksIBspU
  • Review impl ValueLink/linkedIsSlave
  • Implémentation PrivateFolder en DB
Location:
trunk
Files:
6 added
16 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueLinkPropsBsp.java

    r19370 r19581  
    3939package eu.scenari.orient.recordstruct.lib.link; 
    4040 
     41import com.orientechnologies.orient.core.id.ORID; 
     42 
    4143import eu.scenari.orient.recordstruct.IRecordStruct; 
    4244import eu.scenari.orient.recordstruct.IStruct; 
     
    4951import eu.scenari.orient.recordstruct.link.ILinkBothSidePropertiesAdapter; 
    5052import eu.scenari.orient.recordstruct.link.IValueLink; 
     53import eu.scenari.orient.recordstruct.link.IValueRevLinks; 
    5154 
    5255/** 
     
    5861 
    5962        protected BSP fBothSideProps; 
     63 
     64        protected class OriginalLink implements ILink { 
     65 
     66                public <T> T getAdapted(Class<T> pInterface) { 
     67                        return null; 
     68                } 
     69 
     70                public ORID getLinkerId() { 
     71                        return ValueLinkPropsBsp.this.getLinkerId(); 
     72                } 
     73 
     74                public <RET extends IRecordStruct<? extends IValue<?>>> RET getLinker() { 
     75                        return (RET) ValueLinkPropsBsp.this.getLinker(); 
     76                } 
     77 
     78                public ORID getLinkedId() { 
     79                        return ValueLinkPropsBsp.this.fOriginalLinkedRid; 
     80                } 
     81 
     82                public <RET extends IRecordStruct<? extends IValue<?>>> RET getLinked() { 
     83                        return (RET) ValueLinkPropsBsp.this.fOriginalLinkedRecord; 
     84                } 
     85 
     86                public IValueLink getLinkValueInLinker() { 
     87                        return ValueLinkPropsBsp.this; 
     88                } 
     89 
     90                public IValueRevLinks<?> getRevLinksValueInLinked() { 
     91                        return getLinked().getRevLinks(getStruct().getRevLinksStruct()); 
     92                } 
     93 
     94                public String getLinkKey() { 
     95                        return ValueLinkPropsBsp.this.getLinkKey(); 
     96                } 
     97 
     98        } 
    6099 
    61100        public ValueLinkPropsBsp() { 
     
    126165 
    127166        @Override 
     167        protected ILink getOriginalLink() { 
     168                return this; 
     169        } 
     170 
     171        @Override 
    128172        protected void writeLink(IStructWriter pWriter) { 
    129173                super.writeLink(pWriter); 
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueLinkTiny.java

    r19319 r19581  
    267267                                IRecordStruct<? extends IValue<?>> vOriginalRec = getOriginalLinkedRecord(); 
    268268                                if (vOriginalRec != null) { 
    269                                         if (isLinkedIsSlave()) { 
     269                                        if (isLinkedIsSlave() && fLinkedRid != null && fOriginalLinkedRid.equals(fLinkedRid)) { 
     270                                                //Linked is slave and has not been moved before delete 
    270271                                                //FIXME possibly stack overflow if many links chained. 
    271272                                                if (!fReentrancyGuard) { 
     
    285286                                                vOriginalRec.getOrCreateRevLinks(getStruct().getRevLinksStruct()).removeRevLink(vOriginalLink); 
    286287                                                vOriginalRec.save(); 
     288                                        } 
     289                                } 
     290                        } 
     291                        if (isLinkedIsSlave() && fLinkedRid != null && fLinkedRid.isValid() && (fOriginalLinkedRid == null || !fOriginalLinkedRid.equals(fLinkedRid))) { 
     292                                //Linked is slave and point a new linked record to delete 
     293                                //FIXME possibly stack overflow if many links chained. 
     294                                IRecordStruct<? extends IValue<?>> vRec = getLinked(); 
     295                                if (!fReentrancyGuard && vRec != null) { 
     296                                        try { 
     297                                                fReentrancyGuard = true; 
     298                                                getDb().enforceTransaction(); 
     299                                                getDb().delete(vRec); 
     300                                        } finally { 
     301                                                fReentrancyGuard = false; 
    287302                                        } 
    288303                                } 
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksMUBsp.java

    r19338 r19581  
    131131                } 
    132132 
    133                 public String getLinkTypeName() { 
    134                         return null; 
    135                 } 
    136  
    137133                public String getLinkKey() { 
    138134                        return null; 
     
    189185                        return ValueRevLinksMUBsp.this.getPojo().size(); 
    190186                } 
     187 
     188                @Override 
     189                public boolean isEmpty() { 
     190                        return ValueRevLinksMUBsp.this.getPojo().isEmpty(); 
     191                } 
    191192        } 
    192193 
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksUUBsp.java

    r19336 r19581  
    4747import eu.scenari.commons.util.lang.IAdaptable; 
    4848import eu.scenari.commons.util.lang.ScException; 
     49import eu.scenari.orient.IDatabase; 
    4950import eu.scenari.orient.recordstruct.IRecordStruct; 
    5051import eu.scenari.orient.recordstruct.IStruct; 
     
    7475 * Bsp : Manage bothSideProps storage. 
    7576 *  
    76  * Storage scheme : ORID:linkerId, IValue:BothSideProp 
     77 * Storage scheme : ValueRID, IValue:BothSideProp 
    7778 *  
    7879 */ 
     
    9293 
    9394        protected boolean fReentrancyGuard = false; 
     95 
     96        public ValueRevLinksUUBsp() { 
     97 
     98        } 
    9499 
    95100        public <I> I getAdapted(Class<I> pInterface) { 
     
    204209                } 
    205210                if (pStep == IValue.PersistStep.beforeDelete && !fReentrancyGuard) { 
     211                        unmarshall(); 
    206212                        try { 
    207213                                fReentrancyGuard = true; 
     
    276282 
    277283        public <RET extends IRecordStruct<? extends IValue<?>>> RET getLinker() { 
    278                 return fLinkerId.isValid() ? (RET) getDb().load(fLinkerId) : null; 
     284                IDatabase vDb = getDb(); 
     285                assert (vDb != null); 
     286                assert (fLinkerId != null); 
     287                return fLinkerId.isValid() ? (RET) vDb.load(fLinkerId) : null; 
    279288        } 
    280289 
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/named/ValueLinkNamedPropsBsp.java

    r19319 r19581  
    3939package eu.scenari.orient.recordstruct.lib.link.named; 
    4040 
    41 import eu.scenari.commons.util.lang.ScException; 
    4241import eu.scenari.orient.recordstruct.IStruct; 
    4342import eu.scenari.orient.recordstruct.IValue; 
     
    5554        protected String fLinkTypeName; 
    5655 
     56        protected class OriginalNamedLink extends OriginalLink implements ILinkNamedAdapter { 
     57 
     58                @Override 
     59                public <T> T getAdapted(Class<T> pInterface) { 
     60                        if (pInterface == ILinkNamedAdapter.class) return (T) this; 
     61                        return null; 
     62                } 
     63 
     64                public String getLinkTypeName() { 
     65                        return ValueLinkNamedPropsBsp.this.fOriginalLinkTypeName; 
     66                } 
     67        } 
     68 
    5769        public ValueLinkNamedPropsBsp() { 
    5870                super(); 
    5971        } 
    6072 
     73        @Override 
    6174        public <I> I getAdapted(Class<I> pInterface) { 
    6275                if (pInterface == ILinkNamedAdapter.class) return (I) this; 
     
    6881        } 
    6982 
     83        @Override 
    7084        public boolean setLinkTypeName(String pName) { 
    7185                fLinkTypeName = pName; 
     
    7488        } 
    7589 
     90        @Override 
    7691        public boolean isLinkValueBindedWith(ILink pLink) { 
    7792                if (!super.isLinkValueBindedWith(pLink)) return false; 
     
    8297        } 
    8398 
     99        @Override 
    84100        protected boolean isBspDirty() { 
    85101                if (super.isBspDirty()) return true; 
     
    87103        } 
    88104 
     105        @Override 
    89106        protected ILink getOriginalLink() { 
    90                 if (fOriginalLinkTypeName != fLinkTypeName) { 
    91                         //TODO getOriginalLink with OriginalLinkTypeName. 
    92                         throw new ScException("TODO"); 
    93                 } 
     107                if (isBspDirty()) return new OriginalNamedLink(); 
    94108                return this; 
    95109        } 
     
    103117        } 
    104118 
     119        @Override 
    105120        protected void writeLink(IStructWriter pWriter) { 
    106121                super.writeLink(pWriter); 
     
    108123        } 
    109124 
     125        @Override 
    110126        public void initFromStream(IStruct<?> pStruct, StructReader pReader, int pLen, boolean pInitFromDb) { 
    111127                super.initFromStream(pStruct, pReader, pLen, pInitFromDb); 
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/link/LinkUtils.java

    r19315 r19581  
    103103         */ 
    104104        public static void onDeleteLinkedRecord(IValueLink pLink) { 
     105                if (pLink == null) return; 
    105106                switch (pLink.onLinkedDeletion()) { 
    106107                case deleteLinkerRecord: 
  • trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/types/TypesBase.java

    r19348 r19581  
    4949import eu.scenari.orient.recordstruct.lib.base.StructSortedSet; 
    5050import eu.scenari.orient.recordstruct.lib.base.StructSubRecord; 
     51import eu.scenari.orient.recordstruct.lib.bigable.StructBigableDictionary; 
    5152import eu.scenari.orient.recordstruct.lib.bigable.StructBigableMap; 
    5253import eu.scenari.orient.recordstruct.lib.bigable.StructBigableSortedDic; 
     
    8485        public static final StructBigableSortedSet BIGABLE_SORTED_SET = new StructBigableSortedSet(164); 
    8586 
     87        public static final StructBigableDictionary BIGABLE_DICTIONARY = new StructBigableDictionary(165); 
     88 
    8689        //**** Blobs... 
    8790        public static final StructBlob BLOB = new StructBlob(170); 
  • trunk/Jav_UserOdb/src/eu/scenari/userodb/UserOdb.java

    r19348 r19581  
    6464import eu.scenari.userodb.struct.lib.ValueUser; 
    6565import eu.scenari.userodb.struct.lib.ValueUserGroupAbstract; 
    66 import eu.scenari.wspodb.stateless.act.IActUser; 
     66import eu.scenari.wspodb.auth.IOdbUserAdapter; 
    6767 
    6868/** 
    6969 *   
    7070 */ 
    71 public class UserOdb extends UserBase implements IUserGroupable, IUserRolable, IUserTouchStampable, IActUser { 
     71public class UserOdb extends UserBase implements IUserGroupable, IUserRolable, IUserTouchStampable, IOdbUserAdapter { 
    7272 
    7373        protected UserOdbMgr fUserMgr; 
     
    9696                if (pInterface == IUserRolable.class) return (T) this; 
    9797                if (pInterface == IUserTouchStampable.class) return (T) this; 
    98                 if (pInterface == IActUser.class) return (T) this; 
     98                if (pInterface == IOdbUserAdapter.class) return (T) this; 
    9999                if (pInterface == IUserMgr.class) return (T) fUserMgr; 
    100100                return null; 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/auth/IOdbUserAdapter.java

    r19348 r19581  
    3737 * ]]LICENCE 
    3838 */ 
    39 package eu.scenari.wspodb.stateless.act; 
     39package eu.scenari.wspodb.auth; 
    4040 
    4141import com.orientechnologies.orient.core.id.ORID; 
     
    4444 
    4545/** 
    46  * Adapter pour {@link IUser} pour permettre la gestion des liens des acts et de users. 
     46 * Adapter pour {@link IUser} pour permettre la gestion des liens des acts / des private folders (...) et des users. 
    4747 */ 
    48 public interface IActUser { 
     48public interface IOdbUserAdapter { 
    4949 
    5050        public ORID getRid(IUser pUser); 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/config/WspOdbTypes.java

    r19339 r19581  
    4343import eu.scenari.orient.recordstruct.lib.bigable.ValueBigableSortedMap; 
    4444import eu.scenari.orient.recordstruct.lib.link.ValueLinkProps; 
     45import eu.scenari.orient.recordstruct.lib.link.ValueLinkPropsBsp; 
    4546import eu.scenari.orient.recordstruct.lib.link.ValueLinkTiny; 
     47import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksIBspU; 
    4648import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksMUBsp; 
    4749import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksUUBsp; 
     
    5052import eu.scenari.orient.recordstruct.lib.primitive.StructStringCustom; 
    5153import eu.scenari.orient.recordstruct.lib.primitive.ValueByte; 
     54import eu.scenari.orient.recordstruct.lib.primitive.ValueString; 
    5255import eu.scenari.orient.recordstruct.link.IStructLink; 
    5356import eu.scenari.orient.recordstruct.link.IValueLink.OnLinkedDeletion; 
     
    254257        public static final Struct<ValueTask> TASK = new Struct(new ExtendedStructId(55), ValueTask.class); 
    255258 
     259        //############### PRIVATE FOLDER ############## 
     260 
     261        /** 
     262         * Liens inverses pour {@link #LINK_PRIVATE_FOLDER_USER} : liste les private folders définis pour ce user. 
     263         */ 
     264        public static final Struct<ValueRevLinksMUBsp> REVLINKS_PRIVATE_FOLDER_USER = new Struct(new ExtendedStructId(61), ValueRevLinksMUBsp.class, "revLinks_privateFolder_user"); 
     265 
     266        /** 
     267         * Lien d'un {@link ValueSrcContentId} de type privateFolder " appartient au " user. 
     268         */ 
     269        public static final IStructLink<ValueLinkTiny> LINK_PRIVATE_FOLDER_USER = new StructLink(new ExtendedStructId(62), ValueLinkTiny.class, "privateFolder_user").setBidirLink(REVLINKS_PRIVATE_FOLDER_USER, OnLinkedDeletion.deleteLinkerRecord); 
     270 
     271        /** 
     272         * Liens inverses pour {@link #LINK_PRIVATE_FOLDER_SRC} : liste les private folders définis pour cette source, indexée par les account des users. 
     273         */ 
     274        public static final Struct<ValueRevLinksIBspU<ValueString>> REVLINKS_PRIVATE_FOLDER_SRC = new Struct(new ExtendedStructId(63), ValueRevLinksIBspU.class, "revLinks_privateFolder_src"); 
     275 
     276        /** 
     277         * Lien d'un {@link ValueSrcContentId} de type privateFolder " concerne cette " source. 
     278         * Le BSP de ce lien doit être le account du user concerné (utilisé par le RevLinks). 
     279         */ 
     280        public static final IStructLink<ValueLinkPropsBsp<?, ValueString>> LINK_PRIVATE_FOLDER_SRC = new StructLink(new ExtendedStructId(64), ValueLinkPropsBsp.class, "privateFolder_src").setBidirLink(REVLINKS_PRIVATE_FOLDER_SRC, 
     281                        OnLinkedDeletion.deleteLinkerRecord); 
     282 
    256283        /** Pour forcer la déclaration des struct. */ 
    257284        public static void init() { 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/stateless/act/StatelessSrcAnnot.java

    r19505 r19581  
    5353import eu.scenari.commons.util.lang.TunneledException; 
    5454import eu.scenari.orient.recordstruct.lib.base.ValueList; 
     55import eu.scenari.wspodb.auth.IOdbUserAdapter; 
    5556import eu.scenari.wspodb.config.WspOdbTypes; 
    5657import eu.scenari.wspodb.stateless.src.StatelessSrcNode; 
     
    177178                        vNewLink = WspOdbTypes.LINK_ACT.toValue(null, vList); 
    178179                        vList.add(vNewLink); 
    179                         vNewLink.setLinkedId(pUser.getAdapted(IActUser.class).getRid(pUser)); 
     180                        vNewLink.setLinkedId(pUser.getAdapted(IOdbUserAdapter.class).getRid(pUser)); 
    180181                        vNewLink.setLinkedRefId(pUser.getAccount()); 
    181182                        vInvolvedUser = new StatelessInvolvedUser(vNewLink); 
     
    189190                        if (!vNewLink.getLinkedId().isValid()) { 
    190191                                //Le lien a été cassé, on le recréé 
    191                                 vNewLink.setLinkedId(pUser.getAdapted(IActUser.class).getRid(pUser)); 
     192                                vNewLink.setLinkedId(pUser.getAdapted(IOdbUserAdapter.class).getRid(pUser)); 
    192193                        } 
    193194                        vNewLink.setActLinkRole((byte) pInvolvements); 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/stateless/src/StatelessSrcNodeId.java

    r19370 r19581  
    7676import eu.scenari.orient.recordstruct.link.ILinkNamedAdapter; 
    7777import eu.scenari.orient.recordstruct.link.IValueRevLinks; 
     78import eu.scenari.wspodb.auth.IOdbUserAdapter; 
    7879import eu.scenari.wspodb.config.WspOdbTypes; 
    79 import eu.scenari.wspodb.stateless.act.IActUser; 
    8080import eu.scenari.wspodb.stateless.act.StatelessSrcAnnot; 
    8181import eu.scenari.wspodb.struct.IValueSrcContent; 
     
    181181                                                if (vUser != null) { 
    182182                                                        IDatabase vDb = vSrc.getDb(); 
    183                                                         ORID vUserRid = vUser.getAdapted(IActUser.class).getRid(vUser); 
     183                                                        ORID vUserRid = vUser.getAdapted(IOdbUserAdapter.class).getRid(vUser); 
    184184                                                        IRecordStruct<?> vUserRec = vDb.load(vUserRid); 
    185185                                                        ValueRevLinksAct vRevLinks = vUserRec.getRevLinks(WspOdbTypes.REVLINKS_ACT); 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/struct/lib/ValueSrcContentAbstract.java

    r19338 r19581  
    276276                IValueLink vLink = fChildren.getPojo().remove(pName); 
    277277                if (vLink == null) return null; 
    278                 return (IValueSrcContent) vLink.getLinked().getValue(); 
     278                IValueSrcContent vSrc = (IValueSrcContent) vLink.getLinked().getValue(); 
     279                //On efface le lien slave, casse le lien slave si le père devait se trouver supprimé. 
     280                vLink.setLinkedId(null); 
     281                return vSrc; 
    279282        } 
    280283 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/struct/lib/act/ValueLinkAct.java

    r19370 r19581  
    3939package eu.scenari.wspodb.struct.lib.act; 
    4040 
    41 import com.orientechnologies.orient.core.id.ORID; 
    4241import com.scenari.src.act.IAct.ActStage; 
    4342 
    44 import eu.scenari.orient.recordstruct.IRecordStruct; 
    4543import eu.scenari.orient.recordstruct.IStruct; 
    4644import eu.scenari.orient.recordstruct.IValue; 
     
    5048import eu.scenari.orient.recordstruct.lib.link.ValueLinkPropsBsp; 
    5149import eu.scenari.orient.recordstruct.link.ILink; 
    52 import eu.scenari.orient.recordstruct.link.IValueLink; 
    53 import eu.scenari.orient.recordstruct.link.IValueRevLinks; 
    5450import eu.scenari.wspodb.struct.IValueAct; 
    5551 
     
    8581        protected String fLinkedRefId; 
    8682 
    87         protected class OriginalLink implements ILink, ILinkActAdapter { 
    88  
     83        protected class OriginalActLink extends OriginalLink implements ILinkActAdapter { 
     84 
     85                @Override 
    8986                public <T> T getAdapted(Class<T> pInterface) { 
    9087                        if (pInterface == ILinkActAdapter.class) return (T) this; 
     
    10299                public byte getActLinkRole() { 
    103100                        return fOriginalActLinkRole; 
    104                 } 
    105  
    106                 public ORID getLinkerId() { 
    107                         return ValueLinkAct.this.getLinkerId(); 
    108                 } 
    109  
    110                 public <RET extends IRecordStruct<? extends IValue<?>>> RET getLinker() { 
    111                         return (RET) ValueLinkAct.this.getLinker(); 
    112                 } 
    113  
    114                 public ORID getLinkedId() { 
    115                         return ValueLinkAct.this.fOriginalLinkedRid; 
    116                 } 
    117  
    118                 public <RET extends IRecordStruct<? extends IValue<?>>> RET getLinked() { 
    119                         return (RET) ValueLinkAct.this.fOriginalLinkedRecord; 
    120                 } 
    121  
    122                 public IValueLink getLinkValueInLinker() { 
    123                         return ValueLinkAct.this; 
    124                 } 
    125  
    126                 public IValueRevLinks<?> getRevLinksValueInLinked() { 
    127                         return getLinked().getRevLinks(getStruct().getRevLinksStruct()); 
    128                 } 
    129  
    130                 public String getLinkKey() { 
    131                         return ValueLinkAct.this.getLinkKey(); 
    132101                } 
    133102 
     
    221190 
    222191        protected ILink getOriginalLink() { 
    223                 if (isBspDirty()) return new OriginalLink(); 
     192                if (isBspDirty()) return new OriginalActLink(); 
    224193                return this; 
    225194        } 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/wsp/OdbWspDefinition.java

    r19370 r19581  
    6666import com.scenari.src.system.ISrcSystem; 
    6767 
     68import eu.scenari.commons.log.ILogMsg.LogType; 
    6869import eu.scenari.commons.log.LogMgr; 
    6970import eu.scenari.commons.pools.PoolBuffers; 
    7071import eu.scenari.commons.stream.bytes.IByteStream; 
    7172import eu.scenari.commons.user.IUser; 
     73import eu.scenari.commons.user.ThreadUser; 
    7274import eu.scenari.commons.util.lang.Options; 
    7375import eu.scenari.commons.util.lang.TunneledException; 
     
    7678import eu.scenari.orient.IDbDriver; 
    7779import eu.scenari.orient.recordstruct.IRecordStruct; 
     80import eu.scenari.orient.recordstruct.lib.link.ValueLinkPropsBsp; 
     81import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksIBspU; 
    7882import eu.scenari.orient.recordstruct.lib.link.named.ValueRevLinksNamed; 
     83import eu.scenari.orient.recordstruct.lib.primitive.ValueString; 
    7984import eu.scenari.orient.recordstruct.link.ILink; 
    8085import eu.scenari.orient.recordstruct.link.ILinkBothSidePropertiesAdapter; 
    8186import eu.scenari.orient.recordstruct.link.ILinkNamedAdapter; 
     87import eu.scenari.orient.utils.OptimisticUpdateAbstract; 
    8288import eu.scenari.wsp.provider.IWspDefinition; 
    8389import eu.scenari.wsp.provider.IWspProvider; 
     
    8692import eu.scenari.wsp.repos.IWspExternalEvent.ISrcChangeAdapter; 
    8793import eu.scenari.wsp.repos.IWspExternalEvent.WspExtEvtType; 
     94import eu.scenari.wspodb.auth.IOdbUserAdapter; 
    8895import eu.scenari.wspodb.config.WspOdbTypes; 
     96import eu.scenari.wspodb.manager.scid.ScIdFactoryMgr; 
    8997import eu.scenari.wspodb.stateless.act.StatelessSrcAnnot; 
    9098import eu.scenari.wspodb.stateless.src.StatelessSrcNode; 
     
    92100import eu.scenari.wspodb.struct.IValueSrcContent; 
    93101import eu.scenari.wspodb.struct.IValueWsp; 
     102import eu.scenari.wspodb.struct.lib.ValueSrcContentId; 
    94103import eu.scenari.wspodb.struct.lib.drv.ValueDrvSrcContent; 
    95104import eu.scenari.wspodb.wsp.act.OdbWspSrcAnnot; 
     105import eu.scenari.wspodb.wsp.src.OdbPrivateFolderSrcNode; 
    96106import eu.scenari.wspodb.wsp.src.OdbWspSrcNode; 
    97107import eu.scenari.wspodb.wsp.src.OdbWspSrcNodeAbstract; 
     
    120130 
    121131        /** Racine des contenus. */ 
    122         protected ISrcNode fSrcRootContent; 
     132        protected OdbWspSrcNodeAbstract fSrcRootContent; 
    123133 
    124134        protected ORID fWspRid; 
     
    223233 
    224234        /** 
    225          * PrivateData : non implemnté => géré par le Workspace directement. 
     235         * PrivateData : géré uniquement pour le Wsp (srcUri=""), sinon géré  
     236         * par le Workspace directement (mais utilisé actuellemen). 
     237         *  
     238         * NOTE : Si les usages se développent pour des espaces ou items, il faudrait 
     239         * mieux envisager un changement d'API en passant par un Aspect. 
    226240         */ 
    227241        public ISrcServer getPrivateDataFolder(String pSrcUri) throws Exception { 
    228                 return null; 
     242                if (pSrcUri != null && pSrcUri.length() > 0) { 
     243                        LogMgr.publishTrace("getPrivateDataFolder() used on non wsp root uri (not implemnted in DB) : %s", LogType.Info, pSrcUri); 
     244                        return null; 
     245                } 
     246                final IUser vUser = ThreadUser.getUser(); 
     247                final ValueString vValueUser = new ValueString(vUser != null ? vUser.getAccount() : ""); 
     248                final IDatabase vDb = getDbDriver().getThreadLocalDatabase(); 
     249                IRecordStruct<IValueSrcContent<?>> vRecordWsp = vDb.load(fWspRid); 
     250                ValueRevLinksIBspU<ValueString> vPrivateFolders = vRecordWsp.getRevLinks(WspOdbTypes.REVLINKS_PRIVATE_FOLDER_SRC); 
     251                if (vPrivateFolders != null) { 
     252                        ILink vLink = vPrivateFolders.getLink(vValueUser); 
     253                        if (vLink != null && vLink.getLinkerId().isValid()) { 
     254                                //Private Folder Root trouvé 
     255                                return new OdbPrivateFolderSrcNode(this, ISrcNode.URI_ROOT, vLink.getLinkerId()); 
     256                        } 
     257                } 
     258                //Private Folder Root non trouvé pour ce user, on le crée... 
     259                ORID vRid = new OptimisticUpdateAbstract<ORID>(vDb) { 
     260                        @Override 
     261                        protected ORID execute() throws Exception { 
     262                                String vNewId = ScIdFactoryMgr.newScId(vDb); 
     263                                IRecordStruct<ValueSrcContentId> vRec = vDb.newRecord(null); 
     264                                ValueSrcContentId vValuePF = new ValueSrcContentId(vNewId, vRec); 
     265                                vRec.setValue((ValueSrcContentId) vValuePF); 
     266                                vValuePF.getOrCreateExtension(WspOdbTypes.SCID).setScId(vNewId); 
     267                                if (vUser != null) { 
     268                                        vValuePF.getOrCreateExtension(WspOdbTypes.LINK_PRIVATE_FOLDER_USER).setLinkedId(vUser.getAdapted(IOdbUserAdapter.class).getRid(vUser)); 
     269                                } 
     270                                ValueLinkPropsBsp<?, ValueString> vLinkSrc = vValuePF.getOrCreateExtension(WspOdbTypes.LINK_PRIVATE_FOLDER_SRC); 
     271                                vLinkSrc.setLinkedId(fWspRid); 
     272                                vLinkSrc.setBothSideProperties(vValueUser); 
     273                                StatelessSrcNodeId vStatelessNode = new StatelessSrcNodeId(vValuePF); 
     274                                vStatelessNode.createAsFolder(); 
     275                                return vRec.getIdentity(); 
     276                        } 
     277                }.call(); 
     278                return new OdbPrivateFolderSrcNode(this, ISrcNode.URI_ROOT, vRid); 
    229279        } 
    230280 
     
    417467        } 
    418468 
     469        public IHistoController getHistoControllerPrivateFolder() { 
     470                //Histo controller personnalisable par wspDef ? 
     471                return fWspProvider.fHistoControllerPrivateFolder; 
     472        } 
     473 
    419474        public IVersionController getVersionController() { 
    420475                return fWspProvider.fVersionController; 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/wsp/OdbWspProvider.java

    r19348 r19581  
    8686import eu.scenari.wspodb.struct.lib.drv.ValueDrvSrcContent; 
    8787import eu.scenari.wspodb.wsp.histo.HistoController; 
     88import eu.scenari.wspodb.wsp.histo.HistoControllerNone; 
    8889import eu.scenari.wspodb.wsp.vers.VersionController; 
    8990 
     
    113114 
    114115        protected IHistoController fHistoController; 
     116 
     117        protected IHistoController fHistoControllerPrivateFolder; 
    115118 
    116119        protected IVersionController fVersionController; 
     
    378381        public void initProvider() { 
    379382                if (fHistoController == null) fHistoController = new HistoController(); 
     383                if (fHistoControllerPrivateFolder == null) fHistoControllerPrivateFolder = new HistoControllerNone(); 
    380384                if (fVersionController == null) fVersionController = new VersionController(); 
    381385                if (fWspProviderProperties == null) { 
  • trunk/Jav_WspOdb/src/eu/scenari/wspodb/wsp/src/OdbWspSrcNode.java

    r19348 r19581  
    11package eu.scenari.wspodb.wsp.src; 
    22 
    3 import java.io.FilterOutputStream; 
    4 import java.io.IOException; 
    5 import java.io.OutputStream; 
    63import java.util.ArrayList; 
    7 import java.util.Collections; 
    84import java.util.List; 
    95 
    10 import com.scenari.m.bdp.item.fs.WspSrcUtil; 
    11 import com.scenari.src.ISrcContent; 
    126import com.scenari.src.ISrcNode; 
    137import com.scenari.src.aspect.ISrcAspectDef; 
    14 import com.scenari.src.feature.copymove.SrcFeatureCopyMove; 
    15 import com.scenari.src.feature.copymove.SrcFeatureCopyMove.IIfTargetExistBehavior; 
    168import com.scenari.src.feature.drv.IDrvAspect; 
    179import com.scenari.src.feature.drv.SrcFeatureDrv.DrvState; 
    18 import com.scenari.src.feature.history.IHistoryNodeAspect; 
    19 import com.scenari.src.feature.history.ITrashedNodesAspect; 
    2010import com.scenari.src.feature.versions.IVersionableNodeAspect; 
    21 import com.scenari.src.helpers.walkers.SrcIteratorNode; 
    2211 
    23 import eu.scenari.commons.util.collections.ListFilterBase; 
    24 import eu.scenari.commons.util.lang.TunneledException; 
    2512import eu.scenari.orient.IDatabase; 
    2613import eu.scenari.orient.recordstruct.IRecordStruct; 
    27 import eu.scenari.orient.recordstruct.lib.base.ValueBlob; 
    2814import eu.scenari.orient.recordstruct.link.IValueLink; 
    2915import eu.scenari.orient.utils.OptimisticUpdateAbstract; 
    30 import eu.scenari.wsp.item.IWspSrc.WspNodeType; 
    3116import eu.scenari.wspodb.config.WspOdbTypes; 
    3217import eu.scenari.wspodb.stateless.src.StatelessSrcNode; 
     
    4328 *  
    4429 */ 
    45 public class OdbWspSrcNode extends OdbWspSrcNodeAbstract implements ITrashedNodesAspect, IHistoryNodeAspect, IVersionableNodeAspect, IDrvAspect { 
    46         protected final class OpUpdtPushContentInHisto extends OptimisticUpdateAbstract<Void> { 
    47  
    48                 protected boolean fDeleteCurrentContent = false; 
    49  
    50                 protected OpUpdtPushContentInHisto(IDatabase pDb) { 
    51                         super(pDb); 
    52                 } 
    53  
    54                 public OpUpdtPushContentInHisto setDeleteCurrentContent(boolean pDeleteCurrentContent) { 
    55                         fDeleteCurrentContent = pDeleteCurrentContent; 
    56                         return this; 
    57                 } 
    58  
    59                 @Override 
    60                 protected Void execute() throws Exception { 
    61                         StatelessSrcNode vStatelessSrcNode = getStatelessNode(); 
    62                         if (!fWspDefinition.getHistoController().isHistoEntryWanted(vStatelessSrcNode)) return null; 
    63                         IValueSrcContent<?> vValueLiveSrc = vStatelessSrcNode.getWritableValue(true); 
    64                         //Create histo entry. 
    65                         IRecordStruct<IValueSrcContent<?>> vHistoRecord = fWspDefinition.getHistoController().newHistoEntry(vStatelessSrcNode, fWspDefinition); 
    66                         IValueSrcContent vValueHistoSrc = vHistoRecord.getValue(); 
    67                         //Set live src on histoEntry 
    68                         IValueLink vLiveSrcLink = (IValueLink) vValueHistoSrc.getOrCreateExtension(WspOdbTypes.LINK_LIVESRC); 
    69                         vLiveSrcLink.setLinked(vValueLiveSrc.getMainRecord()); 
    70                         //Move older histo. 
    71                         ValueHistoRoot vHistoRoot = vValueLiveSrc.getOrCreateExtension(WspOdbTypes.HISTO_ROOT); 
    72                         IValueLink vLiveOldHistoLink = vHistoRoot.getOlderEntry(); 
    73                         if (vLiveOldHistoLink != null && vLiveOldHistoLink.getLinkedId() != null) { 
    74                                 IValueLink vOldHistoLink = (IValueLink) vValueHistoSrc.getOrCreateExtension(WspOdbTypes.LINK_OLDER_HISTO); 
    75                                 //On bloque la suppression du linked (par défaut en slave). 
    76                                 vLiveOldHistoLink.setLinkedIsSlave(false); 
    77                                 vOldHistoLink.setLinkedId(vLiveOldHistoLink.getLinkedId()); 
    78                         } 
    79                         //Set new histo 
    80                         if (vLiveOldHistoLink == null) vLiveOldHistoLink = vHistoRoot.getOrCreateOlderEntry(); 
    81                         vLiveOldHistoLink.setLinked(vHistoRecord); 
    82                         vHistoRoot.incrementCountEntries(); 
    83                         vHistoRecord.setValue(vValueHistoSrc); 
    84                         //Supprime le blob courant. 
    85                         if (fDeleteCurrentContent) { 
    86                                 vValueLiveSrc.getContent().truncate(); 
    87                         } 
    88                         //save 
    89                         vHistoRecord.save(); 
    90                         vValueLiveSrc.getRecord().save(); 
    91                         return null; 
    92                 } 
    93         } 
    94  
    95         protected final class ContentOutputStream extends FilterOutputStream { 
    96  
    97                 protected final StatelessSrcNode fStatelessSrcNode; 
    98  
    99                 protected ContentOutputStream(OutputStream pOut, StatelessSrcNode pStatelessSrcNode) { 
    100                         super(pOut); 
    101                         fStatelessSrcNode = pStatelessSrcNode; 
    102                 } 
    103  
    104                 @Override 
    105                 public void write(byte[] pB) throws IOException { 
    106                         out.write(pB); 
    107                 } 
    108  
    109                 @Override 
    110                 public void write(byte[] pB, int pOff, int pLen) throws IOException { 
    111                         out.write(pB, pOff, pLen); 
    112                 } 
    113  
    114                 @Override 
    115                 public void close() throws IOException { 
    116                         IDatabase vDb = fWspDefinition.getDbDriver().getThreadLocalDatabase(); 
    117                         vDb.begin(); 
    118                         try { 
    119                                 ValueBlob vPreviousContent = fStatelessSrcNode.getWritableValue(true).getContent(); 
    120                                 if (vPreviousContent != null && vPreviousContent.isExist()) new OpUpdtPushContentInHisto(vDb).call(); 
    121                                 new OptimisticUpdateAbstract<Void>(vDb) { 
    122                                         ValueBlob fValueBlob = null; 
    123  
    124                                         @Override 
    125                                         protected Void execute() throws Exception { 
    126                                                 if (fValueBlob == null) { 
    127                                                         //Premier passage, on mémorise le blob créé en cas d'accès concurrent par la suite. 
    128                                                         fValueBlob = fStatelessSrcNode.getWritableValue(true).getContent(); 
    129                                                         //On clos le stream. 
    130                                                         ContentOutputStream.super.close(); 
    131                                                 } else { 
    132                                                         //Passage suivant après accès concurrent : on réaffecte le blob dans un nouveau StatelessNode. 
    133                                                         getStatelessNode().writeFrom(fValueBlob); 
    134                                                 } 
    135                                                 return null; 
    136                                         } 
    137                                 }.call(); 
    138                         } catch (IOException e) { 
    139                                 vDb.rollback(); 
    140                                 throw e; 
    141                         } catch (Exception e) { 
    142                                 vDb.rollback(); 
    143                                 throw TunneledException.wrap(e); 
    144                         } 
    145                         vDb.commit(); 
    146                 } 
    147         } 
    148  
     30public class OdbWspSrcNode extends OdbWritableSrcNode implements IVersionableNodeAspect, IDrvAspect { 
    14931        public OdbWspSrcNode(OdbWspDefinition pWspDefinition, String pUri) { 
    15032                super(pWspDefinition, pUri); 
     
    15335        @Override 
    15436        public <T> T getAspect(ISrcAspectDef<T> pDefinition) throws Exception { 
    155                 if (pDefinition == ITrashedNodesAspect.TYPE) return (T) this; 
    156                 if (pDefinition == IHistoryNodeAspect.TYPE) return (T) this; 
    15737                if (pDefinition == IVersionableNodeAspect.TYPE) return (T) this; 
    15838                if (pDefinition == IDrvAspect.TYPE && fWspDefinition instanceof OdbWspDefinitionDrv) return (T) this; 
    15939                return super.getAspect(pDefinition); 
    160         } 
    161  
    162         public boolean createAsFile() throws Exception { 
    163                 IDatabase vDb = fWspDefinition.getDbDriver().getThreadLocalDatabase(); 
    164                 boolean vResult; 
    165                 vDb.begin(); 
    166                 try { 
    167                         vResult = new OptimisticUpdateAbstract<Boolean>(vDb) { 
    168                                 @Override 
    169                                 protected Boolean execute() throws Exception { 
    170                                         return getStatelessNode().createAsFile(); 
    171                                 } 
    172                         }.call(); 
    173                 } catch (Exception e) { 
    174                         vDb.rollback(); 
    175                         throw e; 
    176                 } 
    177                 vDb.commit(); 
    178                 return vResult; 
    179         } 
    180  
    181         public boolean createAsFolder() throws Exception { 
    182                 IDatabase vDb = fWspDefinition.getDbDriver().getThreadLocalDatabase(); 
    183                 boolean vResult; 
    184                 vDb.begin(); 
    185                 try { 
    186                         vResult = new OptimisticUpdateAbstract<Boolean>(vDb) { 
    187                                 @Override 
    188                                 protected Boolean execute() throws Exception { 
    189                                         return getStatelessNode().createAsFolder(); 
    190                                 } 
    191                         }.call(); 
    192                 } catch (Exception e) { 
    193                         vDb.rollback(); 
    194                         throw e; 
    195                 } 
    196                 vDb.commit(); 
    197                 return vResult; 
    198         } 
    199  
    200         public boolean removeSrc() throws Exception { 
    201                 IDatabase vDb = fWspDefinition.getDbDriver().getThreadLocalDatabase(); 
    202                 boolean vResult; 
    203                 try { 
    204                         vDb.begin(); 
    205                         vResult = new OptimisticUpdateAbstract<Boolean>(vDb) { 
    206                                 @Override 
    207                                 protected Boolean execute() throws Exception { 
    208                                         return getStatelessNode().removeSrc(); 
    209                                 } 
    210                         }.call(); 
    211                 } catch (Exception e) { 
    212                         vDb.rollback(); 
    213                         throw e; 
    214                 } 
    215                 vDb.commit(); 
    216                 return vResult; 
    217         } 
    218  
    219         public OutputStream newOutputStream(final boolean pEnsureBuffered) throws Exception { 
    220                 final StatelessSrcNode vStatelessSrcNode = getStatelessNode(); 
    221                 OutputStream vOut = vStatelessSrcNode.newOutputStream(pEnsureBuffered); 
    222                 return vOut == null ? null : new ContentOutputStream(vOut, vStatelessSrcNode); 
    223         } 
    224  
    225         public void copyFrom(final ISrcNode pFrom, final IIfTargetExistBehavior pIfTargetExist, final Object... pOptions) throws Exception { 
    226                 IDatabase vDb = fWspDefinition.getDbDriver().getThreadLocalDatabase(); 
    227                 vDb.begin(); 
    228                 try { 
    229                         new OptimisticUpdateAbstract<Void>(vDb) { 
    230                                 @Override 
    231                                 protected Void execute() throws Exception { 
    232                                         getStatelessNode().copyFrom(pFrom, pIfTargetExist, pOptions); 
    233                                         return null; 
    234                                 } 
    235                         }.call(); 
    236                 } catch (Exception e) { 
    237                         vDb.rollback(); 
    238                         throw e; 
    239                 } 
    240                 vDb.commit(); 
    241         } 
    242  
    243         public void moveFrom(final ISrcNode pFrom, final IIfTargetExistBehavior pIfTargetExist, final Object... pOptions) throws Exception { 
    244                 IDatabase vDb = fWspDefinition.getDbDriver().getThreadLocalDatabase(); 
    245                 vDb.begin(); 
    246                 try { 
    247                         new OptimisticUpdateAbstract<Void>(vDb) { 
    248                                 @Override 
    249                                 protected Void execute() throws Exception { 
    250                                         StatelessSrcNode vStatelessNode = getStatelessNode(); 
    251                                         String vOldName = pFrom.getContentName(); 
    252                                         vStatelessNode.moveFrom(pFrom, pIfTargetExist, pOptions); 
    253                                         //On purge le cache car mapping uri / id erroné. 
    254                                         Object vOdbWspSrcFrom = pFrom.getAspect(ODBWSPSRCNODE_ASPECT_TYPE); 
    255                                         if (vOdbWspSrcFrom != null) { 
    256                                                 //On a trouvé le OdbWspSrc original à partir du from 
    257                                                 getDb().getRetainedObjects().remove(this); 
    258                                         } else { 
    259                                                 getDb().getRetainedObjects().clear(); 
    260                                         } 
    261                                         if (vStatelessNode.getContentStatus() == ISrcContent.STATUS_FOLDER && !vOldName.equals(getContentName()) && WspSrcUtil.getWspNodeType(getSrcUri()) == WspNodeType.item) { 
    262                                                 //Hack à revoir : renommage du mainstream des items multi-flux. 
    263                                                 StatelessSrcNode vOldMainStream = (StatelessSrcNode) vStatelessNode.findNodeChild(vOldName); 
    264                                                 if (vOldMainStream != null) { 
    265                                                         StatelessSrcNode vNewMainStream = (StatelessSrcNode) vStatelessNode.findNodeChild(getContentName()); 
    266                                                         vNewMainStream.moveFrom(vOldMainStream, SrcFeatureCopyMove.ITEB_CANCEL_MOVE, pOptions); 
    267                                                         //On purge le cache car mapping uri / id erroné. 
    268                                                         getDb().getRetainedObjects().clear(); 
    269                                                 } 
    270                                         } 
    271                                         return null; 
    272                                 } 
    273                         }.call(); 
    274                 } catch (Exception e) { 
    275                         vDb.rollback(); 
    276                         throw e; 
    277                 } 
    278                 vDb.commit(); 
    279         } 
    280  
    281         public ISrcNode getTrashedNode(String pRefUri) throws Exception { 
    282                 return createWspSrcNode(pRefUri); 
    283         } 
    284  
    285         public List<ISrcNode> getTrashedNodes() throws Exception { 
    286                 final List<ISrcNode> vList = new ArrayList<ISrcNode>(); 
    287                 getStatelessNode().getTrashedNodes(new ListFilterBase<StatelessSrcNode>() { 
    288                         public boolean add(StatelessSrcNode pEntry) { 
    289                                 vList.add(createWspSrcNode(buildSpecialSrcUriTrash(pEntry))); 
    290                                 return true; 
    291                         } 
    292                 }); 
    293                 return vList; 
    294         } 
    295  
    296         public ISrcNode getHistoryNode(String pRefUri) throws Exception { 
    297                 return createWspSrcNode(pRefUri); 
    298         } 
    299  
    300         public List<ISrcNode> getHistoryNodes() throws Exception { 
    301                 StatelessSrcNode vStatelessNode = getStatelessNode(); 
    302                 List<ISrcNode> vResult = new ArrayList<ISrcNode>(32); 
    303                 if (vStatelessNode.getContentStatus() == ISrcContent.STATUS_FOLDER) { 
    304                         SrcIteratorNode<StatelessSrcNode> vIt = new SrcIteratorNode<StatelessSrcNode>(vStatelessNode); 
    305                         int vOffsetParent = vStatelessNode.getNodeLnkParent() == null ? 0 : vStatelessNode.getNodeLnkParent().getSrcUri().length() + 1; 
    306                         for (StatelessSrcNode vCh = vIt.nextNode(); vCh != null; vCh = vIt.nextNode()) { 
    307                                 if (vCh.getContentStatus() == STATUS_FILE) { 
    308                                         appendHistoEntries(vStatelessNode, vCh, vCh.getSrcUri().substring(vOffsetParent), vResult); 
    309                                 } 
    310                         } 
    311                         Collections.sort(vResult, COMPARATOR_LASTMODIF); 
    312                         vResult.add(0, this); 
    313                 } else { 
    314                         vResult.add(this); 
    315                         appendHistoEntries(vStatelessNode, vStatelessNode, vStatelessNode.getContentName(), vResult); 
    316                 } 
    317                 return vResult; 
    31840        } 
    31941 
Note: See TracChangeset for help on using the changeset viewer.