Changeset 19581
- Timestamp:
- 01/30/12 13:40:24 (4 months ago)
- Location:
- trunk
- Files:
-
- 6 added
- 16 edited
- 1 moved
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/bigable/StructBigableDictionary.java (added)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/bigable/ValueBigableDictionary.java (added)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueLinkPropsBsp.java (modified) (4 diffs)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueLinkTiny.java (modified) (2 diffs)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksIBspU.java (added)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksMUBsp.java (modified) (2 diffs)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksUUBsp.java (modified) (5 diffs)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/named/ValueLinkNamedPropsBsp.java (modified) (8 diffs)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/link/LinkUtils.java (modified) (1 diff)
-
Jav_Orient/src/eu/scenari/orient/recordstruct/types/TypesBase.java (modified) (2 diffs)
-
Jav_UserOdb/src/eu/scenari/userodb/UserOdb.java (modified) (2 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/auth/IOdbUserAdapter.java (moved) (moved from trunk/Jav_WspOdb/src/eu/scenari/wspodb/stateless/act/IActUser.java) (2 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/config/WspOdbTypes.java (modified) (3 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/stateless/act/StatelessSrcAnnot.java (modified) (3 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/stateless/src/StatelessSrcNodeId.java (modified) (2 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/struct/lib/ValueSrcContentAbstract.java (modified) (1 diff)
-
Jav_WspOdb/src/eu/scenari/wspodb/struct/lib/act/ValueLinkAct.java (modified) (5 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/wsp/OdbWspDefinition.java (modified) (7 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/wsp/OdbWspProvider.java (modified) (3 diffs)
-
Jav_WspOdb/src/eu/scenari/wspodb/wsp/histo/HistoControllerNone.java (added)
-
Jav_WspOdb/src/eu/scenari/wspodb/wsp/src/OdbPrivateFolderSrcNode.java (added)
-
Jav_WspOdb/src/eu/scenari/wspodb/wsp/src/OdbWritableSrcNode.java (added)
-
Jav_WspOdb/src/eu/scenari/wspodb/wsp/src/OdbWspSrcNode.java (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueLinkPropsBsp.java
r19370 r19581 39 39 package eu.scenari.orient.recordstruct.lib.link; 40 40 41 import com.orientechnologies.orient.core.id.ORID; 42 41 43 import eu.scenari.orient.recordstruct.IRecordStruct; 42 44 import eu.scenari.orient.recordstruct.IStruct; … … 49 51 import eu.scenari.orient.recordstruct.link.ILinkBothSidePropertiesAdapter; 50 52 import eu.scenari.orient.recordstruct.link.IValueLink; 53 import eu.scenari.orient.recordstruct.link.IValueRevLinks; 51 54 52 55 /** … … 58 61 59 62 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 } 60 99 61 100 public ValueLinkPropsBsp() { … … 126 165 127 166 @Override 167 protected ILink getOriginalLink() { 168 return this; 169 } 170 171 @Override 128 172 protected void writeLink(IStructWriter pWriter) { 129 173 super.writeLink(pWriter); -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueLinkTiny.java
r19319 r19581 267 267 IRecordStruct<? extends IValue<?>> vOriginalRec = getOriginalLinkedRecord(); 268 268 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 270 271 //FIXME possibly stack overflow if many links chained. 271 272 if (!fReentrancyGuard) { … … 285 286 vOriginalRec.getOrCreateRevLinks(getStruct().getRevLinksStruct()).removeRevLink(vOriginalLink); 286 287 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; 287 302 } 288 303 } -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksMUBsp.java
r19338 r19581 131 131 } 132 132 133 public String getLinkTypeName() {134 return null;135 }136 137 133 public String getLinkKey() { 138 134 return null; … … 189 185 return ValueRevLinksMUBsp.this.getPojo().size(); 190 186 } 187 188 @Override 189 public boolean isEmpty() { 190 return ValueRevLinksMUBsp.this.getPojo().isEmpty(); 191 } 191 192 } 192 193 -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/ValueRevLinksUUBsp.java
r19336 r19581 47 47 import eu.scenari.commons.util.lang.IAdaptable; 48 48 import eu.scenari.commons.util.lang.ScException; 49 import eu.scenari.orient.IDatabase; 49 50 import eu.scenari.orient.recordstruct.IRecordStruct; 50 51 import eu.scenari.orient.recordstruct.IStruct; … … 74 75 * Bsp : Manage bothSideProps storage. 75 76 * 76 * Storage scheme : ORID:linkerId, IValue:BothSideProp77 * Storage scheme : ValueRID, IValue:BothSideProp 77 78 * 78 79 */ … … 92 93 93 94 protected boolean fReentrancyGuard = false; 95 96 public ValueRevLinksUUBsp() { 97 98 } 94 99 95 100 public <I> I getAdapted(Class<I> pInterface) { … … 204 209 } 205 210 if (pStep == IValue.PersistStep.beforeDelete && !fReentrancyGuard) { 211 unmarshall(); 206 212 try { 207 213 fReentrancyGuard = true; … … 276 282 277 283 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; 279 288 } 280 289 -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/lib/link/named/ValueLinkNamedPropsBsp.java
r19319 r19581 39 39 package eu.scenari.orient.recordstruct.lib.link.named; 40 40 41 import eu.scenari.commons.util.lang.ScException;42 41 import eu.scenari.orient.recordstruct.IStruct; 43 42 import eu.scenari.orient.recordstruct.IValue; … … 55 54 protected String fLinkTypeName; 56 55 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 57 69 public ValueLinkNamedPropsBsp() { 58 70 super(); 59 71 } 60 72 73 @Override 61 74 public <I> I getAdapted(Class<I> pInterface) { 62 75 if (pInterface == ILinkNamedAdapter.class) return (I) this; … … 68 81 } 69 82 83 @Override 70 84 public boolean setLinkTypeName(String pName) { 71 85 fLinkTypeName = pName; … … 74 88 } 75 89 90 @Override 76 91 public boolean isLinkValueBindedWith(ILink pLink) { 77 92 if (!super.isLinkValueBindedWith(pLink)) return false; … … 82 97 } 83 98 99 @Override 84 100 protected boolean isBspDirty() { 85 101 if (super.isBspDirty()) return true; … … 87 103 } 88 104 105 @Override 89 106 protected ILink getOriginalLink() { 90 if (fOriginalLinkTypeName != fLinkTypeName) { 91 //TODO getOriginalLink with OriginalLinkTypeName. 92 throw new ScException("TODO"); 93 } 107 if (isBspDirty()) return new OriginalNamedLink(); 94 108 return this; 95 109 } … … 103 117 } 104 118 119 @Override 105 120 protected void writeLink(IStructWriter pWriter) { 106 121 super.writeLink(pWriter); … … 108 123 } 109 124 125 @Override 110 126 public void initFromStream(IStruct<?> pStruct, StructReader pReader, int pLen, boolean pInitFromDb) { 111 127 super.initFromStream(pStruct, pReader, pLen, pInitFromDb); -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/link/LinkUtils.java
r19315 r19581 103 103 */ 104 104 public static void onDeleteLinkedRecord(IValueLink pLink) { 105 if (pLink == null) return; 105 106 switch (pLink.onLinkedDeletion()) { 106 107 case deleteLinkerRecord: -
trunk/Jav_Orient/src/eu/scenari/orient/recordstruct/types/TypesBase.java
r19348 r19581 49 49 import eu.scenari.orient.recordstruct.lib.base.StructSortedSet; 50 50 import eu.scenari.orient.recordstruct.lib.base.StructSubRecord; 51 import eu.scenari.orient.recordstruct.lib.bigable.StructBigableDictionary; 51 52 import eu.scenari.orient.recordstruct.lib.bigable.StructBigableMap; 52 53 import eu.scenari.orient.recordstruct.lib.bigable.StructBigableSortedDic; … … 84 85 public static final StructBigableSortedSet BIGABLE_SORTED_SET = new StructBigableSortedSet(164); 85 86 87 public static final StructBigableDictionary BIGABLE_DICTIONARY = new StructBigableDictionary(165); 88 86 89 //**** Blobs... 87 90 public static final StructBlob BLOB = new StructBlob(170); -
trunk/Jav_UserOdb/src/eu/scenari/userodb/UserOdb.java
r19348 r19581 64 64 import eu.scenari.userodb.struct.lib.ValueUser; 65 65 import eu.scenari.userodb.struct.lib.ValueUserGroupAbstract; 66 import eu.scenari.wspodb. stateless.act.IActUser;66 import eu.scenari.wspodb.auth.IOdbUserAdapter; 67 67 68 68 /** 69 69 * 70 70 */ 71 public class UserOdb extends UserBase implements IUserGroupable, IUserRolable, IUserTouchStampable, I ActUser {71 public class UserOdb extends UserBase implements IUserGroupable, IUserRolable, IUserTouchStampable, IOdbUserAdapter { 72 72 73 73 protected UserOdbMgr fUserMgr; … … 96 96 if (pInterface == IUserRolable.class) return (T) this; 97 97 if (pInterface == IUserTouchStampable.class) return (T) this; 98 if (pInterface == I ActUser.class) return (T) this;98 if (pInterface == IOdbUserAdapter.class) return (T) this; 99 99 if (pInterface == IUserMgr.class) return (T) fUserMgr; 100 100 return null; -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/auth/IOdbUserAdapter.java
r19348 r19581 37 37 * ]]LICENCE 38 38 */ 39 package eu.scenari.wspodb. stateless.act;39 package eu.scenari.wspodb.auth; 40 40 41 41 import com.orientechnologies.orient.core.id.ORID; … … 44 44 45 45 /** 46 * Adapter pour {@link IUser} pour permettre la gestion des liens des acts et deusers.46 * Adapter pour {@link IUser} pour permettre la gestion des liens des acts / des private folders (...) et des users. 47 47 */ 48 public interface I ActUser {48 public interface IOdbUserAdapter { 49 49 50 50 public ORID getRid(IUser pUser); -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/config/WspOdbTypes.java
r19339 r19581 43 43 import eu.scenari.orient.recordstruct.lib.bigable.ValueBigableSortedMap; 44 44 import eu.scenari.orient.recordstruct.lib.link.ValueLinkProps; 45 import eu.scenari.orient.recordstruct.lib.link.ValueLinkPropsBsp; 45 46 import eu.scenari.orient.recordstruct.lib.link.ValueLinkTiny; 47 import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksIBspU; 46 48 import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksMUBsp; 47 49 import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksUUBsp; … … 50 52 import eu.scenari.orient.recordstruct.lib.primitive.StructStringCustom; 51 53 import eu.scenari.orient.recordstruct.lib.primitive.ValueByte; 54 import eu.scenari.orient.recordstruct.lib.primitive.ValueString; 52 55 import eu.scenari.orient.recordstruct.link.IStructLink; 53 56 import eu.scenari.orient.recordstruct.link.IValueLink.OnLinkedDeletion; … … 254 257 public static final Struct<ValueTask> TASK = new Struct(new ExtendedStructId(55), ValueTask.class); 255 258 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 256 283 /** Pour forcer la déclaration des struct. */ 257 284 public static void init() { -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/stateless/act/StatelessSrcAnnot.java
r19505 r19581 53 53 import eu.scenari.commons.util.lang.TunneledException; 54 54 import eu.scenari.orient.recordstruct.lib.base.ValueList; 55 import eu.scenari.wspodb.auth.IOdbUserAdapter; 55 56 import eu.scenari.wspodb.config.WspOdbTypes; 56 57 import eu.scenari.wspodb.stateless.src.StatelessSrcNode; … … 177 178 vNewLink = WspOdbTypes.LINK_ACT.toValue(null, vList); 178 179 vList.add(vNewLink); 179 vNewLink.setLinkedId(pUser.getAdapted(I ActUser.class).getRid(pUser));180 vNewLink.setLinkedId(pUser.getAdapted(IOdbUserAdapter.class).getRid(pUser)); 180 181 vNewLink.setLinkedRefId(pUser.getAccount()); 181 182 vInvolvedUser = new StatelessInvolvedUser(vNewLink); … … 189 190 if (!vNewLink.getLinkedId().isValid()) { 190 191 //Le lien a été cassé, on le recréé 191 vNewLink.setLinkedId(pUser.getAdapted(I ActUser.class).getRid(pUser));192 vNewLink.setLinkedId(pUser.getAdapted(IOdbUserAdapter.class).getRid(pUser)); 192 193 } 193 194 vNewLink.setActLinkRole((byte) pInvolvements); -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/stateless/src/StatelessSrcNodeId.java
r19370 r19581 76 76 import eu.scenari.orient.recordstruct.link.ILinkNamedAdapter; 77 77 import eu.scenari.orient.recordstruct.link.IValueRevLinks; 78 import eu.scenari.wspodb.auth.IOdbUserAdapter; 78 79 import eu.scenari.wspodb.config.WspOdbTypes; 79 import eu.scenari.wspodb.stateless.act.IActUser;80 80 import eu.scenari.wspodb.stateless.act.StatelessSrcAnnot; 81 81 import eu.scenari.wspodb.struct.IValueSrcContent; … … 181 181 if (vUser != null) { 182 182 IDatabase vDb = vSrc.getDb(); 183 ORID vUserRid = vUser.getAdapted(I ActUser.class).getRid(vUser);183 ORID vUserRid = vUser.getAdapted(IOdbUserAdapter.class).getRid(vUser); 184 184 IRecordStruct<?> vUserRec = vDb.load(vUserRid); 185 185 ValueRevLinksAct vRevLinks = vUserRec.getRevLinks(WspOdbTypes.REVLINKS_ACT); -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/struct/lib/ValueSrcContentAbstract.java
r19338 r19581 276 276 IValueLink vLink = fChildren.getPojo().remove(pName); 277 277 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; 279 282 } 280 283 -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/struct/lib/act/ValueLinkAct.java
r19370 r19581 39 39 package eu.scenari.wspodb.struct.lib.act; 40 40 41 import com.orientechnologies.orient.core.id.ORID;42 41 import com.scenari.src.act.IAct.ActStage; 43 42 44 import eu.scenari.orient.recordstruct.IRecordStruct;45 43 import eu.scenari.orient.recordstruct.IStruct; 46 44 import eu.scenari.orient.recordstruct.IValue; … … 50 48 import eu.scenari.orient.recordstruct.lib.link.ValueLinkPropsBsp; 51 49 import eu.scenari.orient.recordstruct.link.ILink; 52 import eu.scenari.orient.recordstruct.link.IValueLink;53 import eu.scenari.orient.recordstruct.link.IValueRevLinks;54 50 import eu.scenari.wspodb.struct.IValueAct; 55 51 … … 85 81 protected String fLinkedRefId; 86 82 87 protected class OriginalLink implements ILink, ILinkActAdapter { 88 83 protected class OriginalActLink extends OriginalLink implements ILinkActAdapter { 84 85 @Override 89 86 public <T> T getAdapted(Class<T> pInterface) { 90 87 if (pInterface == ILinkActAdapter.class) return (T) this; … … 102 99 public byte getActLinkRole() { 103 100 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();132 101 } 133 102 … … 221 190 222 191 protected ILink getOriginalLink() { 223 if (isBspDirty()) return new Original Link();192 if (isBspDirty()) return new OriginalActLink(); 224 193 return this; 225 194 } -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/wsp/OdbWspDefinition.java
r19370 r19581 66 66 import com.scenari.src.system.ISrcSystem; 67 67 68 import eu.scenari.commons.log.ILogMsg.LogType; 68 69 import eu.scenari.commons.log.LogMgr; 69 70 import eu.scenari.commons.pools.PoolBuffers; 70 71 import eu.scenari.commons.stream.bytes.IByteStream; 71 72 import eu.scenari.commons.user.IUser; 73 import eu.scenari.commons.user.ThreadUser; 72 74 import eu.scenari.commons.util.lang.Options; 73 75 import eu.scenari.commons.util.lang.TunneledException; … … 76 78 import eu.scenari.orient.IDbDriver; 77 79 import eu.scenari.orient.recordstruct.IRecordStruct; 80 import eu.scenari.orient.recordstruct.lib.link.ValueLinkPropsBsp; 81 import eu.scenari.orient.recordstruct.lib.link.ValueRevLinksIBspU; 78 82 import eu.scenari.orient.recordstruct.lib.link.named.ValueRevLinksNamed; 83 import eu.scenari.orient.recordstruct.lib.primitive.ValueString; 79 84 import eu.scenari.orient.recordstruct.link.ILink; 80 85 import eu.scenari.orient.recordstruct.link.ILinkBothSidePropertiesAdapter; 81 86 import eu.scenari.orient.recordstruct.link.ILinkNamedAdapter; 87 import eu.scenari.orient.utils.OptimisticUpdateAbstract; 82 88 import eu.scenari.wsp.provider.IWspDefinition; 83 89 import eu.scenari.wsp.provider.IWspProvider; … … 86 92 import eu.scenari.wsp.repos.IWspExternalEvent.ISrcChangeAdapter; 87 93 import eu.scenari.wsp.repos.IWspExternalEvent.WspExtEvtType; 94 import eu.scenari.wspodb.auth.IOdbUserAdapter; 88 95 import eu.scenari.wspodb.config.WspOdbTypes; 96 import eu.scenari.wspodb.manager.scid.ScIdFactoryMgr; 89 97 import eu.scenari.wspodb.stateless.act.StatelessSrcAnnot; 90 98 import eu.scenari.wspodb.stateless.src.StatelessSrcNode; … … 92 100 import eu.scenari.wspodb.struct.IValueSrcContent; 93 101 import eu.scenari.wspodb.struct.IValueWsp; 102 import eu.scenari.wspodb.struct.lib.ValueSrcContentId; 94 103 import eu.scenari.wspodb.struct.lib.drv.ValueDrvSrcContent; 95 104 import eu.scenari.wspodb.wsp.act.OdbWspSrcAnnot; 105 import eu.scenari.wspodb.wsp.src.OdbPrivateFolderSrcNode; 96 106 import eu.scenari.wspodb.wsp.src.OdbWspSrcNode; 97 107 import eu.scenari.wspodb.wsp.src.OdbWspSrcNodeAbstract; … … 120 130 121 131 /** Racine des contenus. */ 122 protected ISrcNodefSrcRootContent;132 protected OdbWspSrcNodeAbstract fSrcRootContent; 123 133 124 134 protected ORID fWspRid; … … 223 233 224 234 /** 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. 226 240 */ 227 241 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); 229 279 } 230 280 … … 417 467 } 418 468 469 public IHistoController getHistoControllerPrivateFolder() { 470 //Histo controller personnalisable par wspDef ? 471 return fWspProvider.fHistoControllerPrivateFolder; 472 } 473 419 474 public IVersionController getVersionController() { 420 475 return fWspProvider.fVersionController; -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/wsp/OdbWspProvider.java
r19348 r19581 86 86 import eu.scenari.wspodb.struct.lib.drv.ValueDrvSrcContent; 87 87 import eu.scenari.wspodb.wsp.histo.HistoController; 88 import eu.scenari.wspodb.wsp.histo.HistoControllerNone; 88 89 import eu.scenari.wspodb.wsp.vers.VersionController; 89 90 … … 113 114 114 115 protected IHistoController fHistoController; 116 117 protected IHistoController fHistoControllerPrivateFolder; 115 118 116 119 protected IVersionController fVersionController; … … 378 381 public void initProvider() { 379 382 if (fHistoController == null) fHistoController = new HistoController(); 383 if (fHistoControllerPrivateFolder == null) fHistoControllerPrivateFolder = new HistoControllerNone(); 380 384 if (fVersionController == null) fVersionController = new VersionController(); 381 385 if (fWspProviderProperties == null) { -
trunk/Jav_WspOdb/src/eu/scenari/wspodb/wsp/src/OdbWspSrcNode.java
r19348 r19581 1 1 package eu.scenari.wspodb.wsp.src; 2 2 3 import java.io.FilterOutputStream;4 import java.io.IOException;5 import java.io.OutputStream;6 3 import java.util.ArrayList; 7 import java.util.Collections;8 4 import java.util.List; 9 5 10 import com.scenari.m.bdp.item.fs.WspSrcUtil;11 import com.scenari.src.ISrcContent;12 6 import com.scenari.src.ISrcNode; 13 7 import com.scenari.src.aspect.ISrcAspectDef; 14 import com.scenari.src.feature.copymove.SrcFeatureCopyMove;15 import com.scenari.src.feature.copymove.SrcFeatureCopyMove.IIfTargetExistBehavior;16 8 import com.scenari.src.feature.drv.IDrvAspect; 17 9 import com.scenari.src.feature.drv.SrcFeatureDrv.DrvState; 18 import com.scenari.src.feature.history.IHistoryNodeAspect;19 import com.scenari.src.feature.history.ITrashedNodesAspect;20 10 import com.scenari.src.feature.versions.IVersionableNodeAspect; 21 import com.scenari.src.helpers.walkers.SrcIteratorNode;22 11 23 import eu.scenari.commons.util.collections.ListFilterBase;24 import eu.scenari.commons.util.lang.TunneledException;25 12 import eu.scenari.orient.IDatabase; 26 13 import eu.scenari.orient.recordstruct.IRecordStruct; 27 import eu.scenari.orient.recordstruct.lib.base.ValueBlob;28 14 import eu.scenari.orient.recordstruct.link.IValueLink; 29 15 import eu.scenari.orient.utils.OptimisticUpdateAbstract; 30 import eu.scenari.wsp.item.IWspSrc.WspNodeType;31 16 import eu.scenari.wspodb.config.WspOdbTypes; 32 17 import eu.scenari.wspodb.stateless.src.StatelessSrcNode; … … 43 28 * 44 29 */ 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 30 public class OdbWspSrcNode extends OdbWritableSrcNode implements IVersionableNodeAspect, IDrvAspect { 149 31 public OdbWspSrcNode(OdbWspDefinition pWspDefinition, String pUri) { 150 32 super(pWspDefinition, pUri); … … 153 35 @Override 154 36 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;157 37 if (pDefinition == IVersionableNodeAspect.TYPE) return (T) this; 158 38 if (pDefinition == IDrvAspect.TYPE && fWspDefinition instanceof OdbWspDefinitionDrv) return (T) this; 159 39 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 @Override169 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 @Override188 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 @Override207 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 @Override231 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 @Override249 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 from257 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;318 40 } 319 41
Note: See TracChangeset
for help on using the changeset viewer.