<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FSuccessive_Update_Pattern</id>
		<title>Java/Design Pattern/Successive Update Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FSuccessive_Update_Pattern"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Successive_Update_Pattern&amp;action=history"/>
		<updated>2026-04-06T15:32:52Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Successive_Update_Pattern&amp;diff=7811&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Successive_Update_Pattern&amp;diff=7811&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:49Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Successive_Update_Pattern&amp;diff=7810&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Successive_Update_Pattern&amp;diff=7810&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Successive Update Pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.net.MalformedURLException;&lt;br /&gt;
import java.rmi.Naming;&lt;br /&gt;
import java.rmi.NotBoundException;&lt;br /&gt;
import java.rmi.Remote;&lt;br /&gt;
import java.rmi.RemoteException;&lt;br /&gt;
import java.rmi.server.UnicastRemoteObject;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
import java.util.HashMap;&lt;br /&gt;
public class RunSuccessiveUpdatePattern {&lt;br /&gt;
    public static void main(String [] arguments){&lt;br /&gt;
        System.out.println(&amp;quot;Example for the SuccessiveUpdate pattern&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;This code provides a basic demonstration&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; of how the client pull form of this pattern&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; could be applied.&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;In this case, a change made by a client to a&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; central Task object is subsequently retrieved&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot; and displayed by another client.&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Running the RMI compiler (rmic)&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        try{&lt;br /&gt;
            Process p1 = Runtime.getRuntime().exec(&amp;quot;rmic ClientPullServerImpl&amp;quot;);&lt;br /&gt;
            p1.waitFor();&lt;br /&gt;
        }&lt;br /&gt;
        catch (IOException exc){&lt;br /&gt;
            System.err.println(&amp;quot;Unable to run rmic utility. Exiting application.&amp;quot;);&lt;br /&gt;
            System.exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        catch (InterruptedException exc){&lt;br /&gt;
            System.err.println(&amp;quot;Threading problems encountered while using the rmic utility.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Starting the rmiregistry&amp;quot;);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        Process rmiProcess = null;&lt;br /&gt;
        try{&lt;br /&gt;
            rmiProcess = Runtime.getRuntime().exec(&amp;quot;rmiregistry&amp;quot;);&lt;br /&gt;
            Thread.sleep(15000);&lt;br /&gt;
        }&lt;br /&gt;
        catch (IOException exc){&lt;br /&gt;
            System.err.println(&amp;quot;Unable to start the rmiregistry. Exiting application.&amp;quot;);&lt;br /&gt;
            System.exit(1);&lt;br /&gt;
        }&lt;br /&gt;
        catch (InterruptedException exc){&lt;br /&gt;
            System.err.println(&amp;quot;Threading problems encountered when starting the rmiregistry.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        System.out.println(&amp;quot;Creating the ClientPullServer and two PullClient objects&amp;quot;);&lt;br /&gt;
        ClientPullServer server = new ClientPullServerImpl();&lt;br /&gt;
        PullClient clientOne = new PullClient(&amp;quot;Thing I&amp;quot;);&lt;br /&gt;
        PullClient clientTwo = new PullClient(&amp;quot;Thing II&amp;quot;);&lt;br /&gt;
        clientOne.requestTask(&amp;quot;First work step&amp;quot;);&lt;br /&gt;
        clientTwo.requestTask(&amp;quot;First work step&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        try{&lt;br /&gt;
            Thread.sleep(10000);&lt;br /&gt;
        }&lt;br /&gt;
        catch (InterruptedException exc){ }&lt;br /&gt;
        &lt;br /&gt;
        Task task = clientOne.getUpdatedTask();&lt;br /&gt;
        task.setTaskDetails(&amp;quot;Trial for task update&amp;quot;);&lt;br /&gt;
        clientOne.updateTask(task);&lt;br /&gt;
        &lt;br /&gt;
        Task newTask = clientTwo.getUpdatedTask();&lt;br /&gt;
        newTask.setTaskDetails(&amp;quot;New details string&amp;quot;);&lt;br /&gt;
        clientTwo.updateTask(newTask);&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Command implements Serializable{&lt;br /&gt;
    public static final int GET_PROJECT = 1;&lt;br /&gt;
    public static final int GET_TASK = 2;&lt;br /&gt;
    public static final int CREATE_CONTACT = 4;&lt;br /&gt;
    public static final int CREATE_ADDRESS = 8;&lt;br /&gt;
    public static final int CREATE_PHONE_NUMBER = 16;&lt;br /&gt;
    &lt;br /&gt;
    private int command;&lt;br /&gt;
    private Object [] arguments;&lt;br /&gt;
    &lt;br /&gt;
    public int getCommand(){&lt;br /&gt;
        return command;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Object [] getArguments(){&lt;br /&gt;
        return arguments;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setArguments(Object [] newArguments){&lt;br /&gt;
        arguments = newArguments;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setCommand(int newCommand){&lt;br /&gt;
        command = newCommand;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Command(int name, Object [] argumentList){&lt;br /&gt;
        command = name;&lt;br /&gt;
        arguments = argumentList;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interface Task extends Serializable{&lt;br /&gt;
    public String getTaskID();&lt;br /&gt;
    public Date getLastEditDate();&lt;br /&gt;
    public String getTaskName();&lt;br /&gt;
    public String getTaskDetails();&lt;br /&gt;
    public ArrayList getSubTasks();&lt;br /&gt;
    &lt;br /&gt;
    public void setTaskName(String newName);&lt;br /&gt;
    public void setTaskDetails(String newDetails);&lt;br /&gt;
    public void addSubTask(Task task);&lt;br /&gt;
    public void removeSubTask(Task task);&lt;br /&gt;
}&lt;br /&gt;
class TaskImpl implements Task{&lt;br /&gt;
    private String taskID;&lt;br /&gt;
    private Date lastEditDate;&lt;br /&gt;
    private String taskName;&lt;br /&gt;
    private String taskDetails;&lt;br /&gt;
    private ArrayList subTasks = new ArrayList();&lt;br /&gt;
    &lt;br /&gt;
    public TaskImpl(){&lt;br /&gt;
        lastEditDate = new Date();&lt;br /&gt;
        taskName = &amp;quot;&amp;quot;;&lt;br /&gt;
        taskDetails = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    public TaskImpl(String newTaskName, String newTaskDetails,&lt;br /&gt;
      Date newEditDate, ArrayList newSubTasks){&lt;br /&gt;
        lastEditDate = newEditDate;&lt;br /&gt;
        taskName = newTaskName;&lt;br /&gt;
        taskDetails = newTaskDetails;&lt;br /&gt;
        if (newSubTasks != null){ subTasks = newSubTasks; }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getTaskID(){&lt;br /&gt;
        return taskID;&lt;br /&gt;
    }&lt;br /&gt;
    public Date getLastEditDate(){ return lastEditDate; }&lt;br /&gt;
    public String getTaskName(){ return taskName; }&lt;br /&gt;
    public String getTaskDetails(){ return taskDetails; }&lt;br /&gt;
    public ArrayList getSubTasks(){ return subTasks; }&lt;br /&gt;
    &lt;br /&gt;
    public void setLastEditDate(Date newDate){&lt;br /&gt;
        if (newDate.after(lastEditDate)){&lt;br /&gt;
            lastEditDate = newDate;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void setTaskName(String newName){ taskName = newName; }&lt;br /&gt;
    public void setTaskDetails(String newDetails){ taskDetails = newDetails; }&lt;br /&gt;
    public void addSubTask(Task task){&lt;br /&gt;
        if (!subTasks.contains(task)){&lt;br /&gt;
            subTasks.add(task);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void removeSubTask(Task task){&lt;br /&gt;
        subTasks.remove(task);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return taskName + &amp;quot; &amp;quot; + taskDetails;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class ClientPullRequester implements Runnable{&lt;br /&gt;
    private static final int DEFAULT_POLLING_INTERVAL = 10000;&lt;br /&gt;
    private Thread processingThread;&lt;br /&gt;
    private PullClient parent;&lt;br /&gt;
    private ClientPullServer updateServer;&lt;br /&gt;
    private String taskID;&lt;br /&gt;
    private boolean shutdown;&lt;br /&gt;
    private Task currentTask = new TaskImpl();&lt;br /&gt;
    private int pollingInterval = DEFAULT_POLLING_INTERVAL;&lt;br /&gt;
    &lt;br /&gt;
    public ClientPullRequester(PullClient newParent, ClientPullServer newUpdateServer,&lt;br /&gt;
      String newTaskID){&lt;br /&gt;
        parent = newParent;&lt;br /&gt;
        taskID = newTaskID;&lt;br /&gt;
        updateServer = newUpdateServer;&lt;br /&gt;
        processingThread = new Thread(this);&lt;br /&gt;
        processingThread.start();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void run(){&lt;br /&gt;
        while (!isShutdown()){&lt;br /&gt;
            try{&lt;br /&gt;
                currentTask = updateServer.getTask(taskID, currentTask.getLastEditDate());&lt;br /&gt;
                parent.setUpdatedTask(currentTask);&lt;br /&gt;
            }&lt;br /&gt;
            catch (RemoteException exc){ }&lt;br /&gt;
            catch (UpdateException exc){&lt;br /&gt;
                System.out.println(&amp;quot;  &amp;quot; + parent + &amp;quot;: &amp;quot; + exc.getMessage());&lt;br /&gt;
            }&lt;br /&gt;
            try{&lt;br /&gt;
                Thread.sleep(pollingInterval);&lt;br /&gt;
            }&lt;br /&gt;
            catch (InterruptedException exc){ }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void updateTask(Task changedTask){&lt;br /&gt;
        try{&lt;br /&gt;
            updateServer.updateTask(taskID, changedTask);&lt;br /&gt;
        }&lt;br /&gt;
        catch (RemoteException exc){ }&lt;br /&gt;
        catch (UpdateException exc){&lt;br /&gt;
            System.out.println(&amp;quot;  &amp;quot; + parent + &amp;quot;: &amp;quot; + exc.getMessage());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public int getPollingInterval(){ return pollingInterval; }&lt;br /&gt;
    public boolean isShutdown(){ return shutdown; }&lt;br /&gt;
    &lt;br /&gt;
    public void setPollingInterval(int newPollingInterval){ pollingInterval = newPollingInterval; }&lt;br /&gt;
    public void setShutdown(boolean isShutdown){ shutdown = isShutdown; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class UpdateServerDelegate{&lt;br /&gt;
    private static HashMap tasks = new HashMap();&lt;br /&gt;
    &lt;br /&gt;
    public static Task getTask(String taskID, Date lastUpdate) throws UpdateException{&lt;br /&gt;
        if (tasks.containsKey(taskID)){&lt;br /&gt;
            Task storedTask = (Task)tasks.get(taskID);&lt;br /&gt;
            if (storedTask.getLastEditDate().after(lastUpdate)){&lt;br /&gt;
                return storedTask;&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                throw new UpdateException(&amp;quot;Task &amp;quot; + taskID + &amp;quot; does not need to be updated&amp;quot;, UpdateException.TASK_UNCHANGED);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            return loadNewTask(taskID);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void updateTask(String taskID, Task task) throws UpdateException{&lt;br /&gt;
        if (tasks.containsKey(taskID)){&lt;br /&gt;
            if (task.getLastEditDate().equals(((Task)tasks.get(taskID)).getLastEditDate())){&lt;br /&gt;
                ((TaskImpl)task).setLastEditDate(new Date());&lt;br /&gt;
                tasks.put(taskID, task);&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                throw new UpdateException(&amp;quot;Task &amp;quot; + taskID + &amp;quot; data must be refreshed before editing&amp;quot;, UpdateException.TASK_OUT_OF_DATE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static Task loadNewTask(String taskID){&lt;br /&gt;
        Task newTask = new TaskImpl(taskID, &amp;quot;&amp;quot;, new Date(), null);&lt;br /&gt;
        tasks.put(taskID, newTask);&lt;br /&gt;
        return newTask;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class PullClient{&lt;br /&gt;
    private static final String UPDATE_SERVER_SERVICE_NAME = &amp;quot;updateServer&amp;quot;;&lt;br /&gt;
    private static final String UPDATE_SERVER_MACHINE_NAME = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
    private ClientPullServer updateServer;&lt;br /&gt;
    private ClientPullRequester requester;&lt;br /&gt;
    private Task updatedTask;&lt;br /&gt;
    private String clientName;&lt;br /&gt;
    &lt;br /&gt;
    public PullClient(String newClientName){&lt;br /&gt;
        clientName = newClientName;&lt;br /&gt;
        try{&lt;br /&gt;
            String url = &amp;quot;//&amp;quot; + UPDATE_SERVER_MACHINE_NAME + &amp;quot;/&amp;quot; + UPDATE_SERVER_SERVICE_NAME;&lt;br /&gt;
            updateServer = (ClientPullServer)Naming.lookup(url);&lt;br /&gt;
        }&lt;br /&gt;
        catch (RemoteException exc){}&lt;br /&gt;
        catch (NotBoundException exc){}&lt;br /&gt;
        catch (MalformedURLException exc){}&lt;br /&gt;
        catch (ClassCastException exc){}&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void requestTask(String taskID){&lt;br /&gt;
        requester = new ClientPullRequester(this, updateServer, taskID);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void updateTask(Task task){&lt;br /&gt;
        requester.updateTask(task);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Task getUpdatedTask(){&lt;br /&gt;
        return updatedTask;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setUpdatedTask(Task task){&lt;br /&gt;
        updatedTask = task;&lt;br /&gt;
        System.out.println(clientName + &amp;quot;: received updated task: &amp;quot; + task);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String toString(){&lt;br /&gt;
        return clientName;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class TaskResponse implements Serializable{&lt;br /&gt;
    private Date lastUpdate;&lt;br /&gt;
    private Task task;&lt;br /&gt;
    &lt;br /&gt;
    public TaskResponse(Date newUpdate, Task newTask){&lt;br /&gt;
        lastUpdate = newUpdate;&lt;br /&gt;
        task = newTask;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Date getLastUpdate(){&lt;br /&gt;
        return lastUpdate;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Task getTask(){&lt;br /&gt;
        return task;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void setLastUpdate(Date newDate){&lt;br /&gt;
        if (newDate.after(lastUpdate)){&lt;br /&gt;
            lastUpdate = newDate;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class UpdateException extends Exception{&lt;br /&gt;
    public static final int TASK_UNCHANGED = 1;&lt;br /&gt;
    public static final int TASK_OUT_OF_DATE = 2;&lt;br /&gt;
    private int errorCode;&lt;br /&gt;
    &lt;br /&gt;
    public UpdateException(String cause, int newErrorCode){&lt;br /&gt;
        super(cause);&lt;br /&gt;
        errorCode = newErrorCode;&lt;br /&gt;
    }&lt;br /&gt;
    public UpdateException(String cause){ super(cause); }&lt;br /&gt;
    &lt;br /&gt;
    public int getErrorCode(){ return errorCode; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interface ClientPullServer extends Remote{&lt;br /&gt;
    public Task getTask(String taskID, Date lastUpdate) throws RemoteException, UpdateException;&lt;br /&gt;
    public void updateTask(String taskID, Task updatedTask) throws RemoteException, UpdateException;&lt;br /&gt;
}&lt;br /&gt;
class ClientPullServerImpl implements ClientPullServer{&lt;br /&gt;
    private static final String UPDATE_SERVER_SERVICE_NAME = &amp;quot;updateServer&amp;quot;;&lt;br /&gt;
    public ClientPullServerImpl(){&lt;br /&gt;
        try {&lt;br /&gt;
            UnicastRemoteObject.exportObject(this);&lt;br /&gt;
            Naming.rebind(UPDATE_SERVER_SERVICE_NAME, this);&lt;br /&gt;
        }&lt;br /&gt;
        catch (Exception exc){&lt;br /&gt;
            System.err.println(&amp;quot;Error using RMI to register the ClientPullServerImpl &amp;quot; + exc);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public Task getTask(String taskID, Date lastUpdate) throws UpdateException{&lt;br /&gt;
        return UpdateServerDelegate.getTask(taskID, lastUpdate);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void updateTask(String taskID, Task updatedTask) throws UpdateException{&lt;br /&gt;
        UpdateServerDelegate.updateTask(taskID, updatedTask);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>