Hello Adam,
Friday, July 20, 2001, 4:51:10 AM, you wrote:
AY> Well, Iguess if it is going to make your life, or someone elses life
AY> easier, it should be in there. Since you can always refactor, I guess you
AY> use it while things are simple enough, and pull it out when they get too
AY> complex. I just saw how ATG Dynamo attempted to do everything with
AY> Configuration files and the Swing UI and they were saying how
AY> siteadminstrators could add code without needing an engineer. People
AY> believed it. But basically what they wrote wasa scripting layer in XML
AY> that was a propriatary scripting language. Personally, I would prefer
AY> Java Code generation to XML scripting.
I agree with you about scripting in XML config. Of course, it can be
future problem for the Commands.
Thank you for your review - I'l take it into account.
AY> Adam Young
AY> Lead Programmer
AY> RTZ Associates
AY> 510-986-6700
AY> -----Original Message-----
AY> From: Oleg V Alexeev <[EMAIL PROTECTED]>
AY> To: [EMAIL PROTECTED]
AY> Date: Fri, 20 Jul 2001 02:32:20 +0400
AY> Subject: Re[2]: Build Command service on base of FactoryService
>> Hello Adam,
>>
>> Thursday, July 19, 2001, 7:05:59 PM, you wrote:
>>
>> AY> The main reason I am concerned is that I saw this happen in ATG:
>> AY> Processing logic moves from Java code to XML. The problem is that
>> it
>> AY> becomes much harder to isolate a particular Bug. Unit testing is
>> AY> allmost impossible. My suggestion is that if you want to make it
>> easy
>> AY> to do List/Add/Delete functionality, make helper classes to do it.
>> While
>> AY> I've been using JBoss for my Object-Relational mapping, many people
>> have
>> AY> written classes that wrap a table/query etc.
>>
>> May be you are right. But imagine common situation - you are needs to
>> list rows from DB table by the JSP page. So with struts you are place
>> call to the database or to the DAO to the Action and forward to the
>> page. And such operation (write simple call to the JDBC source to
>> execute query and retrieve values) you are needs to perform for every
>> simple query. I think that such processing logic is more than standart
>> and make it part of code is superfluous.
>> For example - experienced developer write processor code to process
>> calls to the JDBC data source and ordinal developer with help of DBA
>> write command tag and place it to the appropriate action. After that
>> he can place tags to retrieve data from objects and not write complex
>> code with calls to the exteranl datasource.
>>
>> AY> The design pattern that best reflects what you are trying to do is
>> the
>> AY> template method (Design Patterns, Go4, p325). You want to separate
>> the
>> AY> flow logic from what happens at each step of the way.
>>
>> AY> void teplateMethod(){
>> AY> step1();
>> AY> step2();
>> AY> if (success(step3()){
>> AY> step4();
>> AY> }
>> AY> }
>>
>> AY> Pretty easy to do in Java, and keeps the code clean.
>>
>> No problem. Commands can be used from java code. Developer can find
>> all needed Processors and Commands and perform call to the processor
>> for the any count of Commands. He can change logic of applications but
>> he don't need to change standart operations under application data.
>>
>> AY> One of the key issues you have to deal with in coding is where does
>> AY> coding leave off and configuration begin. I tend to err on the
>> side of
>> AY> codeing: Abstract methods that must be defined to use the class
>> AY> correctly. At the other extreme is the Interpreter pattern.
>>
>> I don't want to code all Processors and Commands, no. I want to build
>> framework to use Processors and Commands, specified by class name.
>> Everybody can write its own Processor or Command and use it with
>> CommandService. I think JDBC Processor is not single choice to perform
>> processing. There are - RowSet Processor, XML Processor, Castor
>> Processor, etc.
>>
>> AY> One thing I really like about struts is the ability to have one
>> place
>> AY> that you define your Components.
>>
>> AY> The way my make file works, there is not really a big benefit to
>> doing
>> AY> something late bound that does not force a recompile since I end up
>> AY> doing a complete redeploy for any changes. (JBoss with embedded
>> AY> Tomcat). This pushes the focus to building unit tests that run
>> before
>> AY> the deploy stage. Any logic in the XML file makes this more
>> difficult.
>> AY> Granted, it is just another way to develop.
>>
>> Yes, I agree with you... It is difficalt to perform unit tests with
>> it.
>>
>> AY> Adam
>>
>>
>> AY> Oleg V Alexeev wrote:
>>
>> >>Hello Adam,
>> >>
>> >>Wednesday, July 18, 2001, 8:51:58 PM, you wrote:
>> >>
>> >>AY> This sounds like the pipeline/chain setup from ATG. My one
>> concern is
>> >>AY> that you will end up with convoluted processing logic in the xml.
>> >>
>> >>Main idea is to describe commands in XML and let to manipulate such
>> >>blocks without code recompilation.
>> >>
>> >>AY> Iwould recomend that this type of processing stay in the java
>> code. I
>> >>AY> also would be a little wary of the SQL code migrating into the
>> XML.
>> >>
>> >>Why? It can be useful for small projects with insert/update/delete
>> >>logic only.
>> >>
>> >>AY> If this is related to the idea of chaining actions we talked
>> about
>> >>AY> before, it may be better to provide an API inside of the Action
>> object
>> >>AY> Forward to another action. Although What I would like to see is
>> the
>> >>AY> ability of a Action object to take a collection of Form's. While
>> I
>> >>AY> typically would use two (The previopus pages form and the next
>> pages
>> >>AY> form) I could see needing another.
>> >>
>> >>
>> >>AY> Oleg V Alexeev wrote:
>> >>
>> >>>>Hello struts-dev,
>> >>>>
>> >>>> This day I start to build new service for ServiceManager -
>> >>>> CommandService. It would be based on FactoryService (early
>> published
>> >>>> as BeanFactory).
>> >>>>
>> >>>> FactoryService (as BeanFactory) build on base of Abstract Factory
>> >>>> pattern. So its idea is to generate beans and store it to the some
>> >>>> context. Now I found such approach as limited.
>> >>>>
>> >>>> CommandService idea is based on Command pattern. There are two
>> >>>> entity types on playground - Command and Processor. Processor's
>> >>>> missing is to perform Command and prepare predefined count of
>> result
>> >>>> objects. Every action can contain list of calls to the Processors
>> >>>> with appropriate Commands. The most simple way to pass results
>> from
>> >>>> on Porcessor to another is to perfom processing and store result
>> in
>> >>>> some context (request, session, etc.). More flexible way is to
>> >>>> write nested calls to the Processors with appropriate Commands.
>> And
>> >>>> generally all this stuff (set of Processors and
>> >>>> Commands) can be used to build some kind of scripting in
>> >>>> struts-config.xml with BSF framework.
>> >>>>
>> >>>> Example of service manager config in struts-config -
>> >>>>
>> >>>> <service-manager>
>> >>>> <process-registrations>
>> >>>> <process-registration name="preprocess"/>
>> >>>> </process-registrations>
>> >>>> <service-registrations>
>> >>>> <service-registration
>> >>>> name="command"
>> >>>> type="org.apache.struts.service.command.CommandService"
>> >>>> useDigester="true">
>> >>>> <command-service>
>> >>>> <processors>
>> >>>> <processor name="jdbcUpdate" type="some.package.Class">
>> >>>> <result
>> >>>> name="totalUpdated"
>> >>>> type="java.lang.Integer"/>
>> >>>> </processor>
>> >>>> </processors>
>> >>>> <commands>
>> >>>> <command
>> >>>> name="createUser"
>> >>>> command="insert into rb.user( name ) values ( ? )">
>> >>>> <processors>
>> >>>> <processor name="jdbcUpdate"/>
>> >>>> </processors>
>> >>>> <parameter
>> >>>> name="method"
>> >>>> type="java.lang.String"
>> >>>> value="preparedStatement"/>
>> >>>> <parameter
>> >>>> name="userName"
>> >>>> type="java.lang.String"/>
>> >>>> </command>
>> >>>> </commands>
>> >>>> </command-service>
>> >>>> </service-registrations>
>> >>>> </service-manager>
>> >>>>
>> >>>> <action-mappings>
>> >>>> <action path="/user/insert"
>> >>>> type="some.package.Action"
>> >>>> name="userForm"
>> >>>> input="/WEB-INF/jsp/userEdit.jsp">
>> >>>> <perform-command name="createUser"/>
>> >>>> <forward name="success" path="/WEB-INF/jsp/userList.jsp"/>
>> >>>> </action>
>> >>>> </action-mappings>
>> >>>>
>> >>>>
>> >>>>
>> >>
>> >>
>> >>
>> >>
>>
>>
>>
>>
>> --
>> Best regards,
>> Oleg mailto:[EMAIL PROTECTED]
>>
--
Best regards,
Oleg mailto:[EMAIL PROTECTED]