Locking objects in nested collections

Hi,
I am looking at having a data store in memory which will be made up of nested collections e.g. a hashmap whose values are hashmaps. This data store will be accessed by multiple threads and to avoid threading issues on updates I realize I have to implement some form of locking. However I don't want to coarse grain lock the data store for all accesses when updating and I would prefer to lock on a more finer grained level.
My question is this, is it possible to place a lock on an object in a collection or those the entire collection have to be locked e.g. given a hashmap within a hashmap is it possible to lock the inner hashmap and not the outer.
regards
Noel

I don't think there could be any issue. Get the object from the hash map and lock it. But the Object should have synchronized methods to handle multiple threads, So that when multiple threads get reference to the same object from the hash map they get a synchronized access to the data or logic in the Object.

Similar Messages

  • [svn:bz-4.0.0_fixes] 20586: backporting nest object level fix and nest collection level fix from blazeds trunk to 4 .0.0.fixes branch

    Revision: 20586
    Revision: 20586
    Author:   [email protected]
    Date:     2011-03-03 13:44:51 -0800 (Thu, 03 Mar 2011)
    Log Message:
    backporting nest object level fix and nest collection level fix from blazeds trunk to 4.0.0.fixes branch
    checkintests pass
    Modified Paths:
        blazeds/branches/4.0.0_fixes/modules/common/src/flex/messaging/errors.properties
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/endpoints/AbstractEndpoint.j ava
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/SerializationContext.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf0Input.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf0Output.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf3Input.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf3Output.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/AmfIO.java

    Revision: 20586
    Revision: 20586
    Author:   [email protected]
    Date:     2011-03-03 13:44:51 -0800 (Thu, 03 Mar 2011)
    Log Message:
    backporting nest object level fix and nest collection level fix from blazeds trunk to 4.0.0.fixes branch
    checkintests pass
    Modified Paths:
        blazeds/branches/4.0.0_fixes/modules/common/src/flex/messaging/errors.properties
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/endpoints/AbstractEndpoint.j ava
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/SerializationContext.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf0Input.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf0Output.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf3Input.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/Amf3Output.java
        blazeds/branches/4.0.0_fixes/modules/core/src/flex/messaging/io/amf/AmfIO.java

  • XSU: Nested Collections?

    Does anyone know of a way to get around Oracle's limitation on nested collections?
    I have been using XSU to present XML to our Java application layer using objects and object views. Casting multisets works fine for repeating elements as long as the elements themselves don't contain repeating elements. I have been able to get around this with nested cursors, but I am not sure that XSU was designed to work this way. I get a nasty error if any of the cursors return an empty set.
    Example:
    SELECT
    company_name,
    CURSOR(SELECT
    dept_name,
    CURSOR(SELECT
    group_name
    FROM group_table g
    WHERE g.dept_id = d.dept_id) AS "GROUPS"
    FROM
    dept_table d
    WHERE
    d.company_id = c.company_id) AS "DEPARTMENTS"
    FROM company_table c
    If any of the above cursors returns an empty set then I get the following error:
    oracle.xml.sql.OracleXMLSQLException: Closed Statement: oracle.jdbc.oci8.OCIDBStatement@18f375
    Anyone gotten around this another way?

    Hi Christopher,
    I posted a similar question before. I even don't know how to create such a table to store XML data.
    Like your example
    <company>
    <dept>
    <group>
    <emp>
    </emp>
    </group>
    <group>
    </group>
    </dept>
    <dept>
    </dept>
    </company>
    Do you know how to create a table to store this kind of xml data with several hierarchical levels?
    null

  • RMI server object getting garbage collected

    Hi all,
    I have seen a number of posts regarding the ConnectException and found that this can occur in a number of situations.
    I am having a problem here.
    I am having an RMI server that is always up and running. And the server object gets requests from the client at regular intervals. But, when the server object is not receiving any requests for a long time (ex: 1 day), then I think the remote object itself is getting garbage collected. And so, tough I am able to get the remote reference using the lookup method, I am getting "Connection refused to host: 192.168.0.216; nested exception is:
         java.net.ConnectException: Connection refused" when I call a method using this reference.
    I believe that this is because the server object getting garbage collected as there are no requests for the server since long. Please correct me if my assumption is wrong.
    I want to know, after how much time the server object gets garbage collected if no requests are received. But, my requirement is that the server object should always be available and WHENEVER a client request comes then that should be processed. What should I do to accomplish this task.
    If any one have any suggestions, please reply as soon as possible.
    Thanks in advance,
    srik4u

    You might do some research into using an activatable remote object. You run rmid (the rmi activation deamon) and register a subclass of java.rmi.activation.Activatable (instead of the usual UnicastRemoteObject) with it. With an activatable object, the remote reference to the activatable object doesn't need to have a live object behind it. If an activatable object is not running (ie: it hasn't been constructed yet, or it has been garbage collected ...as in your case) a remote reference to the object can still be exported to a client. The first time the client calls a method on the remote object, the activation service on the server sees the object is not active, and activates the object for the client. If the object is running ...it is rmi as usual. But if it gets gc'd again, the next invocation on the remote object will trigger the activation service again.
    (The above explanation paraphrases author David Flanagan from Java Enterprise in a Nutshell, O'Reilly)
    I have only built one of these, which loosely followed an example from the above mentioned book. It's a whole other ballgame over and above a regular rmi object. But like anything else, if you dig in and get your head wrapped around it, it eventually makes sense. Ok, why lie ...it confused the hell out of me and left me a little queasy. But you know the drill, by the time you build a few of them it will probably seem as easy as mapping the human genome, right? At any rate, it seems like what you might be after ...so have a look at it. Good luck, and wear your lifejacket.

  • Printing nested collections

    I have a struts application and trying to display a nested collection. For example, I have an arraylist of Persons object which in turn has a collection of Accounts object. Whats the syntax for iterating through the nested collection using the tags like
    <logic:iterate id="item" name="myList" scope="request" >
    <bean:write name="item" property="firstName"/>
    * How do I iterate through the nested collection of Accounts here
    </logic:terate>
    I want to avoid writing scriplets for the same.
    Thanks

    Collection is not folder it is just the file that is created in the bridge preferences to ease out the navigation for the user.
    Go to C:\Users\<user name>\AppData\Roaming\Adobe\Bridge CS5\Collections
    you will find the filelist files ther with the name of your collection, if you open those file in the wordpard you will see the path of the files included in the collection.
    hence I dont think the nested collection could be created becuase we cannot refer the filelist file in another filelist file.

  • How to migrate nested collections?

    In our SCCM 2007 environment we have dozens of nested collections, some are 4 or 5 collections deep too.   How do you migrate that over to CM2012?   In a lab environment I tried to migrate the collection.
    TestCollection\One Deep\Two Deep\Three Deep
    Each of the 4 collection had a machine inside of it. the migration wizard worked but I don't see my collections in the CM2012 console.
    mqh7

    The Collections should be migrated, ususally it's a refresh of the console that is required to see the new folders and Collections. One thing you can do to verify the migration is checking the "objects in job" status. It will provide you with information
    about the success/failure of the migration. You can also check the migmctl.log file for detailed information about the process.
    Kent Agerlund | My blogs: blog.coretech.dk/kea and
    SCUG.dk/ | Twitter:
    @Agerlund | Linkedin: Kent Agerlund |
    Mastering ConfigMgr 2012 The Fundamentals

  • Implementing lock object

    I've a TCode to modify a report. That TCode picks a doc no. from a table & opens up an editable ALV based on that doc. no .That doc. no. is the only primary key.
    I want that if someone is already opened that report, & if someoen else is trying to open that report, it shouldn't open & should show that -"its locked by User  XXX". I've made a lock object for that table. Please advise what to do next. How to populate the User name who has locked the report.

    used ENQUEUE function  and DEQUEUE function
    Function Modules for Lock Requests
    Activating a lock object in the ABAP Dictionary automatically creates function modules for setting (ENQUEUE_<lock object name>) and releasing (DEQUEUE_<lock object name>) locks.
    The generated function modules are automatically assigned to function groups. You should not change these function modules and their assignment to function groups since the function modules are generated again each time the lock object is activated.
    Never transport the function groups, which contain the automatically generated function modules. The generated function modules of a lock object could reside in a different function group in the target system. Always transport the lock objects. When a lock object is activated in the target system, the function modules are generated again and correctly assigned to function groups.
    Parameters of the Function Modules
    Field Names of the Lock Object
    The keys to be locked must be passed here.
    A further parameter X_<field> that defines the lock behavior when the initial value is passed exists for every lock field <field>. If the initial value is assigned to <field> and X_<field>, then a generic lock is initialized with respect to <field>. If <field> is assigned the initial value and X_<field> is defined as X, the lock is set with exactly the initial value of <field>.
    Parameters for Passing Locks to the Update Program
    A lock is generally removed at the end of the transaction or when the corresponding DEQUEUE function module is called. However, this is not the case if the transaction has called update routines. In this case, a parameter must check that the lock has been removed.
    Parameter _SCOPE controls how the lock or lock release is passed to the update program (see The Owner Concept for Locks). You have the following options:
    &#65399;        _SCOPE = 1: Locks or lock releases are not passed to the update program. The lock is removed when the transaction is ended.
    &#65399;        _SCOPE = 2: The lock or lock release is passed to the update program. The update program is responsible for removing the lock. The interactive program with which the lock was requested no longer has an influence on the lock behavior. This is the standard setting for the ENQUEUE function module.
    &#65399;        _SCOPE = 3: The lock or lock release is also passed to the update program. The lock must be removed in both the interactive program and in the update program. This is the standard setting for the DEQUEUE function module.
    Parameters for Lock Mode
    A parameter MODE_<TAB> exists for each base table TAB of the lock object. The lock mode for this base table can be set dynamically with this parameter. The values allowed for this parameter are S (read lock), E (write lock), X (extended write lock), and O (optimistic lock).
    The lock mode specified when the lock object for the table is created is the default value for this parameter. This default value can, however, be overridden as required when the function module is called.
    If a lock set with a lock mode is to be removed by calling the DEQUEUE function module, this call must have the same value for the parameter MODE_<TAB>.
    Controlling Lock Transmission
    Parameter _COLLECT controls whether the lock request or lock release should be performed directly or whether it should first be written to the local lock container. This parameter can have the following values:
    &#65399;        Initial Value: The lock request or lock release is sent directly to the lock server.
    &#65399;        X: The lock request or lock release is placed in the local lock container. The lock requests and lock releases collected in this lock container can then be sent to the lock server at a later time as a group by calling the function module FLUSH_ENQUEUE.
    Whenever you have lock mode X (extended write lock), locks should not be written to the local lock container if very many locks refer to the same lock table. In this case, there will be a considerable loss in performance in comparison with direct transmission of locks.
    Behavior for Lock Conflicts (ENQUEUE only)
    The ENQUEUE function module also has the parameter _WAIT. This parameter determines the lock behavior when there is a lock conflict.
    You have the following options:
    &#65399;        Initial Value: If a lock attempt fails because there is a competing lock, the exception FOREIGN_LOCK is triggered.
    &#65399;        X: If a lock attempt fails because there is a competing lock, the lock attempt is repeated after waiting for a certain time. The exception FOREIGN_LOCK is triggered only if a certain time limit has elapsed since the first lock attempt. The waiting time and the time limit are defined by profile parameters.
    Controlling Deletion of the Lock Entry (DEQUEUE only)
    The DEQUEUE function module also has the parameter _SYNCHRON.
    If X is passed, the DEQUEUE function waits until the entry has been removed from the lock table. Otherwise it is deleted asynchronously, that is, if the lock table of the system is read directly after the lock is removed, the entry in the lock table may still exist.
    Exceptions of the ENQUEUE Function Module
    &#65399;        FOREIGN_LOCK’: A competing lock already exists. You can find out the name of the user holding the lock by looking at system variable SY-MSGV1.
    &#65399;        SYSTEM_FAILURE: This exception is triggered when the lock server reports that a problem occurred while setting the lock. In this case, the lock could not be set.
    If the exceptions are not processed by the calling program itself, appropriate messages are issued for all exceptions.
    Reference Fields for RFC-Enabled Lock Objects
    The type of an RFC-enabled function module must be completely defined. The parameters of the generated function module therefore have the following reference fields for RFC-enabled lock objects:
    Parameters
    Reference fields
    X_<field name>
    DDENQ_LIKE-XPARFLAG
    _WAIT
    DDENQ_LIKE-WAITFLAG
    _SCOPE
    DDENQ_LIKE-SCOPE
    _SYNCHRON
    DDENQ_LIKE-SYNCHRON
    See also:
    Example for Lock Objects
    http://help.sap.com/saphelp_nw04/helpdata/en/cf/21eebf446011d189700000e8322d00/content.htm

  • Generic Dump Nested Collection Procedure?

    Greetings,
    Anyone have a proc which when passed a (possibly deeply) nested collection will dump a pretty-printed representation via dbms_output?
    I know this is a mostly just a typing exercise using recursion, but
    1. my PL/SQL skills apparently aren't up to the task
    2. I don't see any kind of get_type() function for the dump proc to use to decide how to loop through sub-collections
    so I'd like to see how the experts do it.
    Am using 10g.
    Thanks,
    --jim
    example:
    DECLARE
      TYPE numset_t IS TABLE OF NUMBER;
      TYPE numset_t_aa IS TABLE OF numset_t INDEX BY VARCHAR2(16);
      TYPE numset_t_aa_v IS VARRAY(2) OF numset_t_aa;
      n_aa numset_t_aa;
      n_t_aa_v numset_t_aa_v;
    BEGIN
      n_aa('tens') := numset_t(10,11,12);
      n_aa('ones') := numset_t(1,2,3);
      n_t_aa_v(1) := n_aa;
      n_aa.DELETE('ones');
      SELECT * BULK COLLECT INTO n_aa('hundreds') FROM table(numset_t(103,102,101));
      n_t_aa_v(2) := n_aa;
      dbms_output('dumping n_t_aa_v:');
      dump_collection(n_t_aa_v);
    END;expected output:
    dumping dumping n_t_aa_v:
    1:
      tens:
        1: 10
        2: 11
        3: 12
      ones:
        1: 1
        2: 2
        3: 3
    2:
      tens:
        1: 10
        2: 11
        3: 12
      hundreds:
        1: 103
        2: 102
        3: 101

    Hi,
    Why are you using collections in the first place?
    If the sole purpose here is to generate XML, then you don't need collection at all, just query your base tables with SQL/XML functions.
    If these collections are part of a larger process (besides generating XML), then you'll need to use at least SQL types instead of local PL/SQL types if you want to efficiently generate XML out of them.
    For example, using the XMLType constructor over the topmost object : {message:id=10012696}

  • Lock object is not working automatically

    Hi experts,
    i have a problem , A table is updated by a program which is used by multiple user . I have used lock function module 'ENQUEUE_E_TABLE ' and 'DEQUEUE_E_TABLE' for that . when updation section occurs first user which come first go through it and for rest users amessage cones 'table is locked by XYZ user' . When first completes the updation resr users is not updating automatically they stand at that position where message comes. How to solve this issue?
    Avadhesh Chandra

    Hi,
    We can lock the table before updating the entries. Two types of locks are there.
    1. To lock the entire table. Here when the table is locked by one program, another program will not be able to modify it.
    2. To lock the particular record only. Here when the record is locked by one program, the other program can modify records other than the one locked.
    For option 1
    Use the FM ENQUEUE_E_TABLEE to lock the table and FM DEQUEUE_E_TABLEE to unlock table.
    For option 2
    Go to SE11. There enter the name of your lock object and create it. Next screen you have to mention which field you want to lock.
    For more info. on LOCK OBJECTS go to
    http://help.sap.com/saphelp_nw2004s/helpdata/en/cf/21eea5446011d189700000e8322d00/content.htm
    If you want to lock the entire table, then use the FM said in option 1 in DO-ENDDO loop. 
    Run the loop till it gets successful (sy-subrc = 0)
    DO.
    *Call the FM.
    IF sy-subrc = 0.
        EXIT.
    ENDIF.
    ENDDO.
    If you want to just try some number of times rather than keep on looping then can use for eg: DO 100 TIMES.

  • Ora-04021 timeout occurred while waiting to lock object

    Hai All
    When adding a column into a table then an error comes error
    Error Message:
    ORA-04021: timeout occurred while waiting to lock object .....
    How it happens ...what is the solution....please help
    Shiju..

    Hi
    Identify the session that is using this object, kill it and then perform the ALTER table... or wait until the session that is accessing this table release it.
    Rgds
    Adnan

  • JDAPI Error: ORA-04020: deadlock detected while trying to lock object

    I have written a JDAPI program to perform read-only impact analysis and report any problems.
    The following error is occurring:
    "A deadlock among DDL and parse locks is detected.
    This deadlock is usually due to user errors in the design of an application or from issuing a set of concurrent statements which can cause a deadlock.
    ORA-04020: deadlock detected while trying to lock object /NSPC6/CHECK_FOR_FORM_CHANGE"
    The error refers to a procedure in a PL/SQL library.
    In one case the error occurred after my final "end of processing" message, which is followed only by a call to "Jdapi.shutdown()".
    Any ideas?
    Thanks,
    Neville Sweet.

    I have written a JDAPI program to perform read-only impact analysis and report any problems.
    The following error is occurring:
    "A deadlock among DDL and parse locks is detected.
    This deadlock is usually due to user errors in the design of an application or from issuing a set of concurrent statements which can cause a deadlock.
    ORA-04020: deadlock detected while trying to lock object /NSPC6/CHECK_FOR_FORM_CHANGE"
    The error refers to a procedure in a PL/SQL library.
    In one case the error occurred after my final "end of processing" message, which is followed only by a call to "Jdapi.shutdown()".
    Any ideas?
    Thanks,
    Neville Sweet.

  • Unable to delete Transport Request which contain locked objects

    Hi all,
    I need to delete  some unusable transport requests but as they contain locked objects, it's not possible to delete them. Release operation is just allowed. After releasing these transport requests, I can not find them any more in queue. Please help to find these  transport requests which are released and also provide a solution to delete instead of releasing them.
    Thanks in advance,
    Sanaz.

    Hi,
    Thank you for the reply.
    1. What do you mean by transport request , Shipment Request, Shipment Order or Tour.
    A. I mean requests which can be transported between SAP Systems using TMS (Transport Management System).
    2. What are the objects which has been locked and due to that you are facing this problem.
    A. There are diffrent object types. For examle some customizing have booen done or SAP Note correction has been implemented, ... Therefore some objects have been locked due to these operations
    3. Let's say if it's an freight Unit, then Pls confirm that System dump / error is not the cause for this.
    A. I have no idea about "Freight Unit".
    Thanks,
    Sanaz.

  • Error while lock object creation

    Hi
    When I tried to create a lock object, I get the following error.
    Error: "Total length of lock argument for table XXXXXXXXX longer than 150"
    I have 3 tables in which Table1 is the check table for the value tables (Table2 & Table3). During the process of deletion of a record from Table1 (CT) I need the lock tobe established on value tables and then I delete all the corresponding entries in value tables are also deleted.
    Would like to know If there is any other std ways of doing this ? and
    Solution to overcome the error.
    Regards
    Karthick

    Hi,
    I think the error is becoz you have given too many LOCK parameters in the lock object. the total length of the PARAMTERS of lock object should not exceed 150.
    By default all the KEY fields will be taken as Lock paramters, so your table key's length is more than 150.
    Also why dont you create 3 lock objects for each table and then use only KEY's of each table as LOCK PARAMETERS.
    Then Lock T1 record first then lock T2 and T3 records, then delete records from T2 and T3.
    Then you delete T1 record.
    The execute DEQUEUE_ALL.
    Regards,
    Sesh

  • ? using multiple approval signatures, each locking the fields with collections

    Having fun with LiveCycle to make a "signoff" sheet that will allow a customer to request a "new product" with a PDF form. Once that information is added to our EDR (Eng Design Request) form, I want the form to be forwarded to multiple departments, where each department manager adds their name, date, comments, and then signs the document and forwards it to the next manager. I have it set up with "locking" a "collection fields" with each signature, and that is cool to lock their comments to thier signature, such that someone else can't change their comments without first "clearing" their signature field... just what I wanted, cool,, taking it a step further, I wanted to have the original product data protected such that once signed by one, or more managers (Eng, Sales, President), that the data was locked unless all signatures were cleared. I tried this first by including the product definition fields in every signature's "collection of fields" (set to lock after signing). Thought that would be the ticket, pretty pumped to try it, but once I clear one signature, example the "Eng manager signature" I can go in and mess with the specs and then re-sign the document, and the other signatures are still there, thought I have to clear them, not good,,, 2nd try, I then tried to lock the preceeding "signature field" itself with the next signature (added "sig0" to "sig1" collection) and that worked once, but fell apart on the third approval, as clear one signature openned things right up, when it shouldn't have. Anyway, has anyone found a way to have an approval signoff sheet where once signed the data fields are locked unless all the signature(s) are cleared. I think the programming is not handing multiple locks on the sme field properly, ie all locks on that field must be removed for that field to become editable,, There may be a better way to tackle this..
    PS, I have really learned to be cautious when saving the form out of LiveCyle, then renaming it and save out or "Pro" with read permisions enabled, then see if "Reader" can open it,,, if U R not carefull you get and error that the "document has changed and reader can't save, contact the author,,," that was scary as I had to surf through lots of old revs to find one that would work again, something salvagable without going back to MSWord,,,
    Thanks for your help...

    I think I found a way to get it to do what I want,,,
    1) Use the first signature collection lock to lock only the fields that that person is signing-off on.
    2) The next manager then signs off and locks only his comments and text boxes, as well as the signature of the preceeding manager. This way text fields are only locked by one signature collection and thus to edit anything you have to clear that manager's signature to edit the related text boxes, then to re-sign that section you must clear the other (higher level) signatures to open up the signature field for resigning,,, I think this is providing the protection I want,,, Yea,,, let's get this form back into our stupid ISO system ;)

  • Report to find Locked objects in sap system

    Hi All,
    does anyone know the report to find out the locked objects in an sap system?
              or
    name of the table that stores locked objects ?
    or any other way through which we can find the number of locked objects ?
    Thanks and regards
    Abdul Hadi

    Hi,
    You can unlock locked objects in transaction SE03.
    Click on Display Repaired objects.
    You can see all the objects that are locked.
    To unlock you can select the particular object and click on Unlock.
    Do reward points if the answer to your question is met.
    Regards
    Suhas

Maybe you are looking for

  • Can you determine which songs are not authorized . . .

    without having to try and play every song? I've got about 2600 songs and just restored my iPod and there are 10 that did not transfer. It's only a small percentage but it would be nice to know which ones did not transfer. Thanks in advance.

  • Mac powering off problem (-- is it likely to be the hdd?)

    Hi all, i'm hoping to get some help with a problem I am having with my mac book pro. Some Specs: MacBookPro (model identifier seems to be 3,1) Intel Core 2 Duo, 2.4GHz 2gig memory SMC Version 1.16f8 160gig HDD - ST9160823AS (split into 2 partitions:

  • Issues between power, usb and airport?

    Well, after having my new MacBook Pro for only a couple of weeks, I've come to the conclusion that there are some pretty weird issues between the power manager, usb bus and airport (and from what I've read here, are pretty widespread issues). First,

  • Is it possible to pass blob from java to PL/SQL ?

    Hi, I try to bind a PL/SQL function who return a blob to a java class : Signature of java method :     public static Blob getBLOB(int aId, String aJDBC) {Create PL/SQL function : create or replace function aa_java(myPiId in number,myPiJDBC in varchar

  • Slow broadband problem

    Hello, My broadband is running very slow it should be about 7+mb but appears to be running at 0.25 to 1mb. assuming wired connection. This has been happening since Tuesday and no mention of linework anywhere. Please advise thanks stats - download spe