Rambler's Top100
package com.bexp;

//import com.bexp.swing.*;  //to assertain loose coupling - dont do it!
import org.JWrapper.*;
import org.JWrapper.util.*;
import com.bexp.ejb.*;

import java.util.*;
import java.io.*;

import javax.xml.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

import org.w3c.dom.*;
import org.xml.sax.InputSource;

import static org.JWrapper.function.*;

public abstract class SDApp
    implements ASSERT.Alerter
{
    
    /** A map Class<-->EntityWrpSrc */
    protected Map entities
        = new HashMap();
    public Map getEntitiesMap()
        { return entities; }
    
    /** A map Class<-->JSimpleCompositeWrapper */
    protected Map entity_wrp
        = new HashMap();
    public Map getEntityWrpMap()
        { return entity_wrp; }
    
    /*
    protected Vector startup_wizard_pages
        = new Vector();
        */
    
    /** wConfig should contain wOptions, but only wOptions should be editable explicitly,
     * whereas wConfig should contain invisible config info to be saved.*/
    protected JSimpleCompositeWrapper 
        startup_page = new JSimpleCompositeWrapper("Login info"),
        wConfig = new JSimpleCompositeWrapper("config"),
            wOptions = new JSimpleCompositeWrapper("Options"),
        wTools = new JSimpleCompositeWrapper("Tools");
    
    public JSimpleCompositeWrapper getWConfig()
        { return wConfig; }
    
    static Properties langMap = new Properties();
    public static Properties getLangMap()
        { return langMap; }
    public static String translate(String in)
        { return langMap.getProperty(in,in); }
    
    protected JSimpleDiscreteWrapper wLang
    = new JSimpleDiscreteWrapper("Locale",
        new JAccessAdapter(String.class)
        {
        String name;
        public String get()
            {return name;}
        public void _set(String f) throws Exception
            {
            name = f;
            //alert("loading "+name);//testing
            getLangMap().clear();
            getLangMap().loadFromXML(getClass().getClassLoader().getResourceAsStream("lang/"+name+".xml")); 
            }
        });
    
    
    /** Root node */
    protected JSimpleCompositeWrapper wEntityStock;
    
    protected JSimpleCompositeWrapper wMenu = new JSimpleCompositeWrapper("menu");
    
    protected String username = "guest";
    public String getUsername() { return username; }
    public void setUsername(String str) { username=str; }
        protected JScalarWrapper wUsername =
            new JScalarWrapper("username",
            new JBeanAccessAdapter(this,"Username"));
    
    protected String password = "guest";
    public String getPassword() { return password; }
    public void setPassword(String str) { password=str; }
        protected JScalarWrapper wPassword =
            new org.JWrapper.util.JPasswordWrapper("password",
            new JBeanAccessAdapter(this,"Password"));
    
    protected String hostname = "localhost";
    public String getHostname() { return hostname; }
    public void setHostname(String str) { hostname=str; }
        protected JScalarWrapper wHost =
            new org.JWrapper.JScalarWrapper("host",
            new JBeanAccessAdapter(this,"Hostname"));
        
    protected String mail_event_command = "";
    public String getMailEventCommand() { return mail_event_command; }
    public void setMailEventCommand(String str) { mail_event_command=str; }
        protected JScalarWrapper wMailEventCommand =
            new JScalarWrapper("Mail Event Command",
            new JBeanAccessAdapter(this,"MailEventCommand"));
        
    
    JScalarWrapper HDCWPSw = 
        new JScalarWrapper("Table view load page size",
            new JAccessAdapter(Integer.class)
            {
            public Integer get()
                { return JHomeDynamicCompositeWrapper.getPageSize(); }
            public void _set(Integer ps)
                { JHomeDynamicCompositeWrapper.setPageSize(ps); }
            });
    public JScalarWrapper getHDCWPSWrp()
        { return HDCWPSw; }

    JSimpleDiscreteWrapper createEventIgnored_w = 
        new JSimpleDiscreteWrapper("Ignore create event?",
            new JAccessAdapter(Boolean.class)
            {
            public Boolean get()
                { return JHomeDynamicCompositeWrapper.getCreateEventIgnored(); }
            public void _set(Boolean ignore)
                { JHomeDynamicCompositeWrapper.setCreateEventIgnored(ignore); }
            });
    
    protected boolean running;
    public boolean isRunning()
    {
    return running;
    }
    
//-----------------------
        
//~~~~~~~~~~~~~~~   CONSTRUCTOR:
    public SDApp() throws Exception
        {
        //ASSERT.setAlerter(this);//bad idea? is 'this' constructed enough at this point?
        
        wEntityStock = new JSimpleCompositeWrapper("");
        
        startup_page.add( wUsername );
        startup_page.add( wPassword );
        
        wConfig.add(wOptions);
        
        wOptions.add(HDCWPSw);
        wOptions.add(createEventIgnored_w);
            createEventIgnored_w.addObject(true, new JSimpleCompositeWrapper("true"));
            createEventIgnored_w.addObject(false, new JSimpleCompositeWrapper("false"));
        wOptions.add(wMailEventCommand);
        
        wOptions.getUserFunctions()
        .put("save",new UserFunction("Save Setup",wTools)
            {
            public void act() throws Exception
                {
                TransformerFactory transFactory = TransformerFactory.newInstance();
                
                DocumentBuilderFactory factory =
                    DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                char[] config = 
                    ObjSession
                        .getSession()
                            .getCurrentPerson()
                                .getConfig();
                
                Document candidate = (config!=null)?
                    (
                    builder.parse(new InputSource(new CharArrayReader(
                            config)))
                            ):null;
                Document doc = org.JWrapper.util.DOMAdapter.createDocument(wConfig,candidate);
                    
                DOMSource dom_src = new DOMSource(doc);
                Transformer transformer = transFactory.newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT,"yes");
                //ByteArrayOutputStream os = new ByteArrayOutputStream();
                CharArrayWriter sw = new CharArrayWriter();
                StreamResult result
                    = new StreamResult(sw);
                transformer.transform(dom_src,result);
                sw.flush();
                //os.flush();
                //os.close();
                com.bexp.ejb.Person.SDObj cperson = ObjSession.getSession().getCurrentPerson();
                cperson.setConfig(sw.toCharArray());
                cperson.save();
                }
            } );
        
        
        JSimpleCompositeWrapper wSession = new JSimpleCompositeWrapper("Session");
            wSession.getUserFunctions()
                .put("connect",new UserFunction("Connect As",wSession)
                    { public void act() throws Exception { run(); } } );
            wSession.getUserFunctions()
                .put("exit",new UserFunction("Exit",wSession)
                    { public void act() { exit(); } } );
        wMenu.add(wSession);
        
        wTools.getUserFunctions()
            .put("options",new UserFunction("Options",wTools)
                { public void act() throws Exception { edit(wOptions); } } );
        wTools.getUserFunctions()
            .put("run_gc",new UserFunction("Run Garbage Collector",wTools)
                { public void act() throws Exception
                    {
                    setWaitingState(true);
                    (new Thread(){public void run()
                        {
                        System.out.println("");
                        System.gc();
                        System.out.println("");
                        } }).start();
                    setWaitingState(false);
                    }
                    });
        wTools.getUserFunctions()
        .put("run_gc_s",new UserFunction("Run Server Garbage Collector",wTools)
            { public void act() throws Exception
                {
                setWaitingState(true);
                System.out.println("");
                ObjSession.getSession().runSGC();
                System.out.println("");
                setWaitingState(false);
                }
                });
        wMenu.add(wTools);
        
        JSimpleCompositeWrapper wHelp = new JSimpleCompositeWrapper("Help");
            wHelp.getUserFunctions()
                .put("help_about",new UserFunction("About",wHelp)
                    { public void act() { alert("Business Experts Service Desk v3.9 Copyright 2006");} } );
            wHelp.getUserFunctions()
                .put("help",new UserFunction("Help",wHelp)
                        { public void act() { showDocumentation();} } );
        wMenu.add(wHelp);
        
        //---   lang:
        wOptions.add(wLang);
        //wLang.addObject("",)
        Properties locales = new Properties();
        try
        {
        locales.loadFromXML(getClass().getClassLoader().getResourceAsStream("lang/locales.xml"));
        } catch(Throwable th) {th.printStackTrace();}
        for(Object key:locales.keySet())
            {
            String name = (String) key;
            wLang.addObject(name,new JSimpleCompositeWrapper((String)locales.get(key)));
            }
/*        
        File langDir = new File("lang");
        File[] langFiles = langDir.listFiles(new FileFilter()
            {public boolean accept(File f){return f.isFile();}});
        for(File f : langFiles)
            {
            wLang.addObject(f,new JSimpleCompositeWrapper(f.getName().split("\\.")[0]));
            }
  */      
        }
        
    public abstract void showDocumentation();
    
    /**
     * 
     * should be overridden in subcless which wants to be non-interactive
     */
    protected boolean isInteractive()
        { return true; }
    
    /** A method called after the user supplied all info like 
     * username,password,hostname etc. */
    public void run() throws Exception
        {
        System.out.println("");//   debug
        running = true;
        ASSERT.setAlerter(this);
            
        boolean keep_trying = true;
        
        while(keep_trying)
        try
        {
            SDDialog login_dlg = createDialog(startup_page,null,true);
            final SDDialog DLG = login_dlg;
        
            JAccessAdapter edit_result
                    = new JVarAccessAdapter(new Boolean(Boolean.FALSE));
                final JAccessAdapter RESw = edit_result;
            UserFunction
            LogIn = new UserFunction("Log in",startup_page)
                {
                JAccessAdapter RESULT=RESw;
                SDDialog DIALOG = DLG;
                public void act() throws Exception
                    { RESULT.set(true); DIALOG.close();}
                },
            Close = new UserFunction("Close",startup_page)
                {
                JAccessAdapter RESULT=RESw;
                SDDialog DIALOG = DLG;
                public void act() throws Exception
                    { RESULT.set(false); DIALOG.close();}
                };
        startup_page.getUserFunctions().put("login",LogIn);
        startup_page.getUserFunctions().put("close",Close);
                
        login_dlg.open();
        
        if(! edit_result.get().booleanValue())
            if((!ObjSession.isConnected()))
            {
            System.out.println("++++++++++++ By! ++++++++++++++++");
            exit();
            if(!running) { return; }
            } else { return; }
        //this.edit(startup_page);
        showWrapper(null);// clear show area if user said OK
        
        ASSERT.setWaitingState(true);
        
        ObjSession.connect(hostname,username,password);
        keep_trying=false;
        
        } catch(Throwable ex)
        {
        if(ex instanceof javax.naming.CommunicationException)
            { alert("Server unreachable.");ex.printStackTrace(); }
        else if(ex instanceof javax.naming.NameNotFoundException)
            { alert("Server component not deployed."); }
        else if(ex instanceof java.lang.NoClassDefFoundError)
            { alert("Server unreachable.");ex.printStackTrace(); }
        else
            { alert(ex); }
        keep_trying=this.confirm("Something goes wrong. Try again?");
        if(!keep_trying) { exit(); }
        }
        finally
            { ASSERT.setWaitingState(false); }
        //connected!
        ObjSession.getSession().setClientSide(true);

        ASSERT.setWaitingState(true);
        //-----direct dir_tree->wrappers variant:
        //  
        readSiteMap();
        //  
        try
            {
            subscribeToMessages();
            } catch(Exception ex) {alert(ex);}
            try
                { wEntityStock.setName(username+"@"+hostname); }
            catch(Exception ex) { ex.printStackTrace(); }
        
        //  
        try
            {
            synchronized(this)
                {
                char[] config = 
                    ObjSession
                        .getSession()
                            .getCurrentPerson()
                                .getConfig();
                if(config!=null)
                org.JWrapper.util.DOMAdapter
                    .fillWrapperFromXML(wConfig,new CharArrayReader(config));
                }
            } catch(Exception ex)
                {
                System.out.println("Reading config failed: "+ex);
                ex.printStackTrace();
                }
        ASSERT.setWaitingState(false);
        //  
        
        System.out.println("");//   debug
        }

    protected void readSiteMap()
        {
        try
        {
        Document document;
        DocumentBuilderFactory factory =
        DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        //document = builder.parse(new File("sitemap.xml"));
        document = builder.parse(this.getClass().getClassLoader()
            .getResourceAsStream(this.getSitemapPath()));
        System.out.println("document is "+document);
        System.out.println(new BufferedReader(new InputStreamReader(this.getClass().getClassLoader()
                .getResourceAsStream("sitemap.xml"))).readLine());
        //root_node.add();
        wEntityStock.removeAll();
        JWrapper wXML = xml_to_wrappers((Element) document
                .getDocumentElement(),"com.bexp");
        //System.out.println("wXML is "+wXML);
        wEntityStock.add(wXML);
        //System.out.println(this.entities);//testing
        //System.out.println(document.toString());//testing
        for(EntityWrpSrc ews : entities.values())
            {
            JWrapper config = ews.getConfig();
            if(config!=null) { wOptions.add(config); }
            }
        } catch(Exception ex) {alert(ex);}
        }
    
    public String getSitemapPath()
        { return "sitemap.xml"; }//this is the default, should be overridden if needed
    
    private void subscribeToMessages() throws Exception
        {
        HomeEventProxy hproxy = ObjSession.getSession().getEventProxy(com.bexp.ejb.Message.SDObj.class);
        hproxy.getRecvSignal().disconnect_all();
        hproxy.getRecvSignal().connect(
                new function1()
                {
                IObjHome msg_home = ObjSession.getSession().getHome(com.bexp.ejb.Message.SDObj.class);
                public Void Op(ObjHomeEvent evt) throws Exception
                    {
                    if(evt.getEventID()==ObjHomeEvent.Changed)
                        {
                        com.bexp.ejb.Message.MessageEvent msg_evt
                            = (com.bexp.ejb.Message.MessageEvent) evt;
                        if(ObjSession.getSession().getCurrentPerson().getPK().equals(msg_evt.getRecipientPK()))
                            {
                            com.bexp.ejb.Message.SDObj message = msg_home.getObj(evt.getObjectPK());
                            if(message.getIsRead().booleanValue()==false)
                                {
                                alert("You have received a message." +
                                        "You can read it in 'Message' section");
                                if((mail_event_command!=null)&&(mail_event_command.length()>0))
                                    {
                                    String cmd = mail_event_command.replace("",
                                                message.getMsgBody().replaceAll("(\"[^\"]*)(\\s)([^\"]*\")", "\1\\s\3"));
                                    String cmds[] = cmd.split("\\s");
                                    for(int i=0; i()
                            {
                            EntityWrpSrc ews = EWS;
                            public EntityWrpSrc Op()
                            {return ews;}
                            }));//;ews.createChooserWrapper();
                    entities.put(ews.getEntityClass().getPackage(),ews);
                    if(result!=null)// i.e. if already there's something to return
                        {
                        //System.out.println("case 1");
                        entity_wrp.put(ews.getEntityClass().getPackage(),cwrp);
                        if(ews.visible()) { cwrp.add(WRP); }
                        }
                    else
                        {
                        //System.out.println("case 2");
                        if(ews.visible())
                            {
                            //System.out.println("case 2.0");
                            result = WRP;
                            //entity_wrp.put(ews.getEntityClass().getPackage(),result);
                            } else {/*System.out.println("case 2.1");*/result=null;} }
                    }//other cases like 'DefaultInfo.class' are ignored here
               } catch(Exception ex) { /*ex.printStackTrace();*//*ignore*/; }//uncomment to debug
            }
    }
    if(result!=null)
    if(result instanceof JCompositeWrapper)
        try
        {
        if(((JCompositeWrapper)result).size()==0) { result=null; }
        } catch(Throwable th) { /*result=result*/ }
    return result;
    }
    
    /**
     * Stack of open dialogs
     */
    protected Stack open_dialogs = new Stack();
    
    /** Namely. Edit the Wrapper. Contains common logic.
     * all UI-specific logic should be implemented in editWrapper in subclasses.
     * Subject to change in future.*/
    public final boolean edit(JWrapper wrp) throws Exception
        { return edit(wrp,true); }
    
    public final boolean edit(JWrapper wrp, boolean modal) throws Exception
        {
        SDDialog parent_dlg = null;
        try{ parent_dlg = open_dialogs.peek(); } catch(Exception ex) {}
        SDDialog dlg = createDialog(wrp,parent_dlg, modal);
            final SDDialog DLG = dlg;
        
        JAccessAdapter edit_result
                = new JVarAccessAdapter(new Boolean(Boolean.FALSE));
            final JAccessAdapter RESw = edit_result;
        UserFunction
        Confirm = new UserFunction("confirm","OK",wrp)
            {
            JAccessAdapter RESULT=RESw;
            SDDialog DIALOG = DLG;
            public void act() throws Exception
                { RESULT.set(true); DIALOG.close();}
            },
        Cancel = new UserFunction("cancel","Cancel",wrp)
            {
            SDDialog DIALOG = DLG;
            JAccessAdapter RESULT=RESw;
            public void act() throws Exception
                { RESULT.set(false); DIALOG.close();}
            };
        /*
        Map functions = wrp.getUserFunctions();
            functions.put("confirm",Confirm);
            functions.put("cancel",Cancel);
        dlg.open();
            functions.remove("confirm");
            functions.remove("cancel");
        */
        dlg.addUserFunction(Confirm);
        dlg.addUserFunction(Cancel);
        open_dialogs.push(dlg);
        dlg.open();
        open_dialogs.pop();
            
        return edit_result.get().booleanValue();
        }
    /**look: edit(JWrapper)*/
    protected abstract SDDialog createDialog(JWrapper wrp, SDDialog parent, boolean modal) throws Exception;
    
    //protected abstract SDStockView createStockView(JWrapper wrp) throws Exception;
    
    /** Displays somehow the wrapper in root window, for swing perhaps in 'right pane' */
    //same as viewDCWrapper was made for?
    public abstract void showWrapper(JWrapper wrp);
    
    /** Alert method replacing ::alert(Object) in ASSERT.Alerter class*/
    public void alert(Object subject)
        {
      
    	System.out.println("-------------------------------");
        System.out.println(subject);
        if(subject instanceof Exception)
            {
            Exception ex = (Exception) subject;
            if(ex instanceof SecurityException)
                {System.out.println("-------------  Access denied! -----------------");}
            //((Exception)subject).printStackTrace();
            System.out.println(ex.getCause());
            }
        System.out.println("-------------------------------");
        }
    
    /** Alert method replacing ::alert(Object,Object) in ASSERT.Alerter class*/
    public void alert(Object src,Object subject)
        {
        alert(src.getClass().getName()+":\n");
        alert(subject);
        }
    
    /** Show user a confirmation dialog with question str.
     * Expected: 'yes' or 'no' */
    public abstract boolean confirm(String str);
    
    //stale
    // subject to remove, but perhaps we'll need it?
    /*
    protected abstract void viewDCWrapper(JDynamicCompositeWrapper wrp);
    
    protected abstract void viewDCWrapper
        (JDiscreteWrapper dw);
    */
    
    //stale
    /** Like selectWrapper(JDiscreteWrapper<... ; another argument type */
    public final JWrapper selectWrapper(JCompositeWrapper cw)
        throws Exception
        {
        List result = selectWrappers(cw);
        if(result.size()>1) { throw new Exception("Choose only one!"); }
        if(result.size()==0) {return null;}
        return result.get(0);
        }
    
    public abstract List selectWrappers(JCompositeWrapper cw)
        throws Exception;

    /** Subclesses should provide implementation of this method.
     * Expected behaviour: ask user to pick up the :Wrapper - 
     * one of provided in passed parameter */
    public final JWrapper selectWrapper
        (JDiscreteWrapper dw)
            throws Exception
            {
            List result = selectWrappers(dw);
            if(result.size()>1) { throw new Exception("Choose only one!"); }
            if(result.size()==0) {return null;}
            return result.get(0);
            }
    public abstract List selectWrappers
        (JDiscreteWrapper dw)
            throws Exception;
    
    public final JWrapper selectWrapperFromStock
    	(JCompositeWrapper cw)
        throws Exception
        {
        List result = selectWrappersFromStock(cw);
        if(result==null) {return null;}
        if(result.size()==0) {return null;}
        if(result.size()>1) { throw new Exception("Choose only one!"); }
        return result.get(0);
        }

    public List selectWrappersFromStock(Class target_class)
    	throws Exception
    	{
        JCompositeWrapper wStockSubtree = (target_class!=null)?entity_wrp.get(target_class.getPackage()):null;
        List wrps = null;
        
        if(wStockSubtree!=null)
    	    { wrps = selectWrappersFromStock(wStockSubtree); }
        if(wrps==null)
            {
            System.out.println("@@@@@@@@@@   selecting...");
            EntityWrpSrc e_src = getEntitiesMap()
                .get(target_class.getPackage());
            JDiscreteWrapper
                chooser
                = e_src.createChooserWrapper();
            chooser.set_value(0);
            wrps = selectWrappers(chooser);
            }
        return wrps;
    	}
    
    public List selectWrappersFromStock(JCompositeWrapper cw)
        throws Exception
        {
        final JAccessAdapter DLG_F
            = new JVarAccessAdapter(null);
        //final function0 DLG_F;

        final JAccessAdapter>> wrp_selector
            = new JVarAccessAdapter>>(null);
        //final function0 wrp_selector;
        
        JAccessAdapter> edit_result
            = new JVarAccessAdapter>(null);
        final JAccessAdapter> RESw = edit_result;
        
        UserFunction
        Confirm = new UserFunction("OK",cw)
            {
            JAccessAdapter DIALOG_F = DLG_F;
            JAccessAdapter>> WRP_SELECTOR = wrp_selector;
            JAccessAdapter> RESULT=RESw;
            public void act() throws Exception
                { RESULT.set(wrp_selector.get().Op()); DIALOG_F.get().close();}
            },
        Cancel = new UserFunction("Cancel",cw)
            {
            JAccessAdapter DIALOG_F = DLG_F;
            JAccessAdapter> RESULT=RESw;
            public void act() throws Exception
                { RESULT.set(null); DIALOG_F.get().close();}
            };
        
        Map functions = cw.getUserFunctions();
            functions.put("confirm",Confirm);
            functions.put("cancel",Cancel);
            Pair> > pair = getStockWrappersSelector(cw);
        if(pair==null) { return null; }
        SDDialog dlg = pair.get1st();
        DLG_F.set(dlg);
        wrp_selector.set(pair.get2nd());
        open_dialogs.push(dlg);
        dlg.open();
        open_dialogs.pop();
            functions.remove("confirm");
            functions.remove("cancel");
        System.out.print("Selected: "); System.out.println(edit_result.get());//debug
        return edit_result.get();
        }
    
    protected abstract Pair> >
        getStockWrappersSelector(JCompositeWrapper cw) throws Exception;
    
    /** Provides deferred function call returnung 
     * something like ::edit(JWrapper) inside*/
    public Collection getEditors(JWrapper _ewrp) throws Exception
    	{
        Collection result = new LinkedList();
    	if(_ewrp instanceof JLeafWrapper)
    	{
    	final JLeafWrapper l_ewrp = (JLeafWrapper)_ewrp;
        Class target_class = l_ewrp.getAccessAdapter().getTargetClass();
        final Class target_class_ = target_class;
        final EntityWrpSrc esrc = (target_class!=null)?entities.get(target_class.getPackage()):null;
        final JCompositeWrapper wStockSubtree = (target_class!=null)?entity_wrp.get(target_class.getPackage()):null;
        
    	if(esrc!=null)
    		{
    		final function0 default_f;
            if(wStockSubtree==null)
            {
            default_f = new function0()
    			{
    			JLeafWrapper lewrp = l_ewrp;
                EntityWrpSrc e_src = esrc;
    			public Void Op() throws Exception
		    		{
    				//new SingleWrapperTableView(this.);
                    JDiscreteWrapper
                        chooser
                        = e_src.createChooserWrapper();
                    chooser.set_value(0);
                    JWrapper wrp = selectWrapper(chooser);
		            if(wrp==null) {return null;}
                    JWrapper parent_wrp = wrp.getParent();
                    //assert (parent_wrp!=null) : "You have selected something wrong :) ";
                    //lewrp.setRawValue(chooser.getRawValue().getObjByWrapper(wrp));
                    if(parent_wrp==null) { throw new Exception("You have selected something wrong :) "); }
                    lewrp.setRawValue(((JHomeDynamicCompositeWrapper) parent_wrp).getHandleByWrapper(wrp).getObj());
		            return null;
		    		}
    			};
            }
            else
                default_f = new function0()
                {
                JLeafWrapper lewrp = l_ewrp;
                //EntityWrpSrc e_src = esrc;
                //JCompositeWrapper subtree = wStockSubtree;
                Class target_class = target_class_;
                public Void Op() throws Exception
                    {
                    JWrapper wrp = selectWrappersFromStock(target_class).get(0);
                    if(wrp==null) {return null;}
                    JWrapper parent_wrp = wrp.getParent();
                    if(parent_wrp==null) { throw new Exception("You have selected something wrong :) "); }
                    lewrp.setRawValue(((JHomeDynamicCompositeWrapper) parent_wrp)
                            .getHandleByWrapper(wrp).getObj());
                    return null;
                    }
                };
                
                UserFunction selector = new UserFunction("choose","Select",_ewrp)
    			{
    			JLeafWrapper lewrp = l_ewrp;
                EntityWrpSrc e_src = esrc;
                function0 _default_f = default_f;
    			public void act() throws Exception
		    		{
    				if(lewrp.getRawValue()!=null)
	    				{
                        JAccessAdapter aa = lewrp.getAccessAdapter();
                        JHomeDynamicCompositeWrapper dwrp;
                        if(aa instanceof ObjHandleAccessAdapter)
                            {
                            dwrp = esrc.createDefaultWrapper(
                                        new SingleObjSrc(
                                                new function0()
                                                {
                                                public ObjHandle Op() throws Exception
                                                 {return ((ObjHandleAccessAdapter)lewrp.getAccessAdapter()).getHandle();}
                                                }
                                                ));
                            } else
                            {
                            dwrp = esrc.createDefaultWrapper(
                                    new SingleObjSrc(
                                    new function0()
                                    {
                                    public ObjHandle Op() throws Exception
                                     {return new ObjHandle((Obj)lewrp.getRawValue(),true);}
                                    }
                                    ));
                            }
	    				show_single_wrapper(lewrp ,dwrp, _default_f);
	    				dwrp.terminate();
	    				} else
	    				{
	    				_default_f.Op();
	    				}
		            //return null;
		    		}
    			},
                editor = new UserFunction("open","Edit",_ewrp)
                {
                JLeafWrapper lewrp = l_ewrp;
                EntityWrpSrc e_src = esrc;
                public void act() throws Exception
                    {
                    JAccessAdapter aa = lewrp.getAccessAdapter();
                    JHomeDynamicCompositeWrapper dcw;
                    if(aa instanceof ObjHandleAccessAdapter)
                    {
                    dcw = esrc.createDefaultWrapper(
                                new SingleObjSrc(
                                        new function0()
                                        {
                                        public ObjHandle Op() throws Exception
                                         {return ((ObjHandleAccessAdapter)lewrp.getAccessAdapter()).getHandle();}
                                        }
                                        ));
                    } else
                    {
                    dcw = esrc.createDefaultWrapper(
                            new SingleObjSrc(
                            new function0()
                            {
                            public ObjHandle Op() throws Exception
                             {return new ObjHandle((Obj)lewrp.getRawValue(),true);}
                            }
                            ));
                    }
                    dcw.edit(dcw.getWrapperByObj((Obj)lewrp.getRawValue()));
                    //return null;
                    }
                };
                final UserFunction editor_ = editor;
                l_ewrp.getSignalChanged().connect(
                        new function0()
                        {
                        JLeafWrapper LW = l_ewrp;
                        UserFunction EDIT = editor_;
                        public Void Op() throws Exception
                            {
                            try{ EDIT.setIsEnabled(LW.getRawValue()!=null); }
                            catch(Exception ex) {}//do nothing
                            return null;
                            }
                        });
                editor.setIsEnabled(l_ewrp.getRawValue()!=null);
    		//return f;
            if(l_ewrp.getAccessAdapter().isRW()) { result.add(selector); }
            result.add(editor);
    		}
    	}
        else
        if(_ewrp instanceof JDynamicCompositeWrapper)
            {
            final JDynamicCompositeWrapper dcw = (JDynamicCompositeWrapper) _ewrp;
            UserFunction editor = new UserFunction("open","Edit",_ewrp)
                {
                JDynamicCompositeWrapper DCW = dcw;
                public void act() throws Exception
                    {
                    edit(DCW);
                    }
                };
            result.add(editor);
            }
    	//return null;//default
        return result;
    	}
    
    protected abstract void show_single_wrapper(
            JLeafWrapper _ref_wrp,
            JHomeDynamicCompositeWrapper _dcwrp,
            function0 _edit_f
            ) throws Exception;

/** The means to provide user ability to run
 * general-purpose 'use cases'(function points; right term?)
 * of JWrapper class. Look: JWrapper::getUserFunctions() */
/*
    public final java.util.Vector > getCommonFunctions(JWrapper wrp)
        {
        java.util.Vector > ret = 
            new java.util.Vector >(0);
        if(wrp instanceof JLeafWrapper)
        if(! (wrp instanceof JDiscreteWrapper))
        if(((JLeafWrapper)wrp).getAccessAdapter()
            .getTargetClass().isAssignableFrom(Obj.class))
            {
            final JLeafWrapper lw = (JLeafWrapper) wrp;
            /**
            if(lw.getAccessAdapter().getTargetClass()==com.bexp.ejb.BE.SDObj.class)
                {
                function0 selectFunction = new function0()
                    {
                    JLeafWrapper LW = lw;
                    public Void Op() throws Exception
                        {
                        DefaultBEWrapper bew =
                        new DefaultBEWrapper(defaultObjSrc);
                        JWrapper wrp = selectWrapper(bew);
                        if(wrp==null) {return null;}
                        LW.setRawValue(bew.getObjByWrapper(wrp));
                        return null;
                        }
                    };
                    ret.add(selectFunction);
                }
            else
            if(lw.getAccessAdapter().getTargetClass()==OU.class)
                {
                function0 selectFunction = new function0()
                    {
                    JLeafWrapper LW = lw;
                    public Void Op() throws Exception
                        {
                        DefaultOUWrapper ouw =
                        new DefaultOUWrapper(defaultObjSrc);
                        JWrapper wrp = selectWrapper(ouw);
                        if(wrp==null) {return null;}
                        LW.setRawValue(ouw.getObjByWrapper(wrp));
                        return null;
                        }
                    };
                    ret.add(selectFunction);
                }
            }
        return ret;
        }
*/
}

Предприятие реального времени №1

На главную   Новости   Карта сайта
  Rambler's Top100