星期四, 2月 24, 2011

[Mysql] SP where in

DROP PROCEDURE IF EXISTS `simpleproc08`$$

CREATE PROCEDURE `simpleproc08`(IN param0 TEXT, OUT param1 INT)
BEGIN
SET @qry = CONCAT('SELECT COUNT(*) INTO @param1 FROM regions WHERE regions_id IN (', param0, ')');
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET param1 = @param1;
END$$

DELIMITER ;

CALL simpleproc08('1, 2, 3', @a);
SELECT @a;
Result:
@a
------
3

[Java] HttpClient

使用Apache Client 實作 Post Get

星期三, 2月 23, 2011

[Alfresco] Authority

AuthorityDAOImpl.java
Language: Java
License: GPL
Copyright: (C) 2005-2007 Alfresco Software Limited.
LOC: 471

AuthorityServiceImpl.java
Language: Java
License: GPL
Copyright: (C) 2005-2007 Alfresco Software Limited.
LOC: 215

Reference:
Repository Cache Configuration
Repository Configuration

星期二, 2月 15, 2011

[Alfresco] Alfresco APIs Reference

if you want to use alfresco APIs to build costomized web application,those are some links as the following
Tips:Navigate to Web Script List:http://localhost:8080/alfresco/service/index
  1. RESTful API (source code path:remote-api/config/alfresco/templates/webscripts/org/alfresco/*)
    1. 3.1 REST API
    2. Deployment REST API
    3. 3.0 REST API
    4. Repository RESTful API Reference
    5. 2.1 REST API
    6. 2.0 RESTful API
    7. OpenSearch
    8. REST Design Guidelines
    9. CMIS RESTful API Reference
  2. 3.4 JavaScript Services API 
  3. JavaScript API Cookbook
  4. Java Foundation API

星期四, 1月 27, 2011

[Alfresco] Peer-Association 範例

BaseWebServiceSystemTest.java 
使用foundation api範例

[Alfresco] Avatar

--UserManager printProperties--
{http://www.alfresco.org/model/content/1.0}name:myfbphoto.jpg
{http://www.alfresco.org/model/system/1.0}node-dbid:20391
{http://www.alfresco.org/model/system/1.0}store-identifier:SpacesStore
{http://www.alfresco.org/model/content/1.0}content:contentUrl=store://2011/1/14/10/30/a9fc0ee8-f528-40c8-b4f2-f53459120a47.bin|mimetype=image/jpeg|size=13245|encoding=utf-8|locale=zh_TW_
{http://www.alfresco.org/model/content/1.0}modified:2011-01-14T10:30:51.377+08:00
{http://www.alfresco.org/model/system/1.0}node-uuid:100cbbf4-39c3-41cc-8d79-a80b112347a2
{http://www.alfresco.org/model/content/1.0}created:2011-01-14T10:30:51.377+08:00
{http://www.alfresco.org/model/system/1.0}store-protocol:workspace
{http://www.alfresco.org/model/content/1.0}creator:Ken
{http://www.alfresco.org/model/content/1.0}modifier:Ken
associationType:{http://www.alfresco.org/model/content/1.0}avatar
{http://www.alfresco.org/model/content/1.0}path:/{http://www.alfresco.org/model/system/1.0}system/{http://www.alfresco.org/model/system/1.0}people/{http://www.alfresco.org/model/content/1.0}ken/{http://www.alfresco.org/model/content/1.0}myfbphoto.jpg
--/UserManager printProperties--

星期三, 1月 26, 2011

[ZK] comfirm in zk component

使用程式控制替元件加入comfirm javascript。
範例如下:
//removePhoto.setWidgetListener("onClick", "alert('test');");
removePhoto.setWidgetListener("onClick", "if(!confirm('Remove Your Picture?')){evt.stop({au:true});}");

A client-side event listener could stop the sending of a widget event to the server by invoking Event.stop(Map) with {au:true}, such as

evt.stop({au: true});

Reference:
ZK Client-side Reference/Notifications/Widget Events
ZK Client-side Reference/Communication/AU Requests/Client-side Firing

星期一, 1月 24, 2011

[Alfresco] AdministrationServiceSystemTest.java

AdministrationServiceSystemTest.java
Language: Java
License: GPL
Copyright: (C) 2005-2007 Alfresco Software Limited.
LOC: 304
使用alfresco webservice提供簡單的User management測試範例,值得參考。


Reference:
AdministrationServiceSystemTest.java 

星期三, 1月 12, 2011

[Windows] 使用 net use 指令連線網路磁碟機

如果想要把連線指定到你本機的磁碟機p:,那可以這樣用
net use p: "\\serverip\foldername" /user:useraccount password /persistent:no

星期日, 1月 09, 2011

[Asp.Net] Https using WebClient

等入驗證之前先補上這一段就可以取得加密的憑證

即可用正常的webclient
try
{
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate(object senderX, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true;
};
HtmlText = wc.DownloadString(wc.BaseAddress);

}
catch
{
System.Environment.Exit(System.Environment.ExitCode);
}

[Alfresco] Node References and Store Protocols

了解Alfresco的NodeRef與StoreRef的差異。

Reference:
Node References and Store Protocols

SourceCode:
NodeArchiveServiceImpl.java 
NodeRefTest.java
ArchiveAndRestoreTest.java

星期二, 1月 04, 2011

[Alfresco] Content Domain Model Notes

這隻ContentModel.java實作Alfresco Data Domain Model相關的QNAME,
簡單來說,就是把各個Data Domain Model內定義的QNAME,
用程式控制來取得完整的QName String

QNAME Format:{NameSapce}Name
Example:{http://www.alfresco.org/model/content/1.0}content


簡單分析contentModel.xml的結構:
model(root)
  --imports
  --namespaces
  --constrains
  --types
     --title
     --parent
     --archive
     --association
        --child-association
     --properties
        --property
   --aspects
      --aspect
      --title(aspect標題)
      --properties(aspect擁有的屬性集)
        --property
           --title(property標題)
           --type(屬性資料型態)
           --default(資料是否有預設值)
           --protected
           --index
           --mandatory
  --mandotory-aspects
     --aspect
  --associations
     --association
     --child-association

看ContentModel.xml原始碼

Reference:
ContentModel.java

[Alfresco] How to rename User Groups using web services? (4)

重新命名群組,下面程式尚未測試過,僅供參考。

[Alfresco] Node Testing

做了一些實驗的資料:

[Alfresco] delete a specific file without archival

If you want to delete a specific file without archival, then you can just apply the sys:temporary aspect prior to deletion.


nodeService.addAspect(nodeRef, ContentModel.ASPECT_TEMPORARY); 
PS: NodeService is not exposed as WebService API.

Reference:
Archive Store Lucene query
Invoking NodeService instance
Disabling Document Archival


[Alfresco] CMIS (Content Management Interoperability Services)

CMIS (Content Management Interoperability Services) is a standard for improving interoperability between ECM systems. It specifies a domain model plus a set of services and protocol bindings for Web Services (SOAP) and AtomPub.


Reference:
OpenCMIS Cookbook(Sample Code)
CMIS Webservice Wiki(新增的CMIS WS服務)

星期一, 1月 03, 2011

[Alfresco] NodeArchiveServiceImpl

/*
 * Copyright (C) 2005-2010 Alfresco Software Limited.
 *
 * This file is part of Alfresco
 *
 * Alfresco is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Alfresco is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Alfresco. If not, see .
 */
package org.alfresco.repo.node.archive;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.batch.BatchProcessWorkProvider;
import org.alfresco.repo.batch.BatchProcessor;
import org.alfresco.repo.batch.BatchProcessor.BatchProcessWorker;
import org.alfresco.repo.lock.JobLockService;
import org.alfresco.repo.lock.LockAcquisitionException;
import org.alfresco.repo.node.archive.RestoreNodeReport.RestoreStatus;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.EqualsHelper;
import org.alfresco.util.VmShutdownListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Implementation of the node archive abstraction.
 * 
 * @author Derek Hulley
 */
public class NodeArchiveServiceImpl implements NodeArchiveService
{
    private static final QName LOCK_QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "NodeArchive");
    private static final long LOCK_TTL = 60000;
    
    private static final String MSG_BUSY = "node.archive.msg.busy";
    
    private static Log logger = LogFactory.getLog(NodeArchiveServiceImpl.class);
    
    private NodeService nodeService;
    private SearchService searchService;
    private TransactionService transactionService;
    private JobLockService jobLockService;

    public void setNodeService(NodeService nodeService)
    {
        this.nodeService = nodeService;
    }

    public void setTransactionService(TransactionService transactionService)
    {
        this.transactionService = transactionService;
    }

    public void setSearchService(SearchService searchService)
    {
        this.searchService = searchService;
    }

    public NodeRef getStoreArchiveNode(StoreRef originalStoreRef)
    {
        return nodeService.getStoreArchiveNode(originalStoreRef);
    }

    public void setJobLockService(JobLockService jobLockService)
    {
        this.jobLockService = jobLockService;
    }

    public NodeRef getArchivedNode(NodeRef originalNodeRef)
    {
        StoreRef orginalStoreRef = originalNodeRef.getStoreRef();
        NodeRef archiveRootNodeRef = nodeService.getStoreArchiveNode(orginalStoreRef);
        // create the likely location of the archived node
        NodeRef archivedNodeRef = new NodeRef(
                archiveRootNodeRef.getStoreRef(),
                originalNodeRef.getId());
        return archivedNodeRef;
    }
    
    /**
     * Get all the nodes that were archived from the given store.
     * 
     * @param originalStoreRef      the original store to process
     * @param skipCount             the number of results to skip (used for paging)
     * @param limit                 the number of items to retrieve or -1 to get the all    
     * 
     * @deprecated          To be replaced with a limiting search against the database
     */
    private ResultSet getArchivedNodes(StoreRef originalStoreRef, int skipCount, int limit)
    {
        // Get the archive location
        NodeRef archiveParentNodeRef = nodeService.getStoreArchiveNode(originalStoreRef);
        StoreRef archiveStoreRef = archiveParentNodeRef.getStoreRef();
        // build the query
        String query = String.format("PARENT:\"%s\" AND ASPECT:\"%s\"", archiveParentNodeRef, ContentModel.ASPECT_ARCHIVED);
        // search parameters
        SearchParameters params = new SearchParameters();
        params.addStore(archiveStoreRef);
        params.setLanguage(SearchService.LANGUAGE_LUCENE);
        params.setQuery(query);
        params.setSkipCount(skipCount);
        params.setMaxItems(limit);
        // get all archived children using a search
        ResultSet rs = searchService.query(params);
        // done
        return rs;
    }
    
    /**
     * @return                      Returns a work provider for batch processing
     * 
     * @since 3.3.4
     */
    private BatchProcessWorkProvider getArchivedNodesWorkProvider(final StoreRef originalStoreRef, final String lockToken)
    {
        return new BatchProcessWorkProvider()
        {
            private VmShutdownListener vmShutdownLister = new VmShutdownListener("getArchivedNodesWorkProvider");
            private Integer workSize;
            private int skipResults = 0;
            public synchronized int getTotalEstimatedWorkSize()
            {
                if (workSize == null)
                {
                    workSize = Integer.valueOf(0);
                    ResultSet rs = null;
                    try
                    {
                        rs = getArchivedNodes(originalStoreRef, 0, -1);
                        workSize = rs.length();
                    }
                    catch (Throwable e)
                    {
                        logger.error("Failed to get archive size", e);
                    }
                    finally
                    {
                        if (rs != null) { rs.close(); }
                    }
                }
                return workSize;
            }
            public synchronized Collection getNextWork()
            {
                if (vmShutdownLister.isVmShuttingDown())
                {
                    return Collections.emptyList();
                }
                // Make sure we still have the lock
                try
                {
                    // TODO: Replace with joblock callback mechanism that provides shutdown hints
                    jobLockService.refreshLock(lockToken, LOCK_QNAME, LOCK_TTL);
                }
                catch (LockAcquisitionException e)
                {
                    // This is OK.  We don't have the lock so just quit
                    return Collections.emptyList();
                }
                
                Collection results = new ArrayList(100);
                ResultSet rs = null;
                try
                {
                    rs = getArchivedNodes(originalStoreRef, skipResults, 100);
                    for (ResultSetRow row : rs)
                    {
                        results.add(row.getNodeRef());
                    }
                    skipResults += results.size();
                }
                finally
                {
                    if (rs != null) { rs.close(); }
                }
                return results;
            }
        };
    }

    /**
     * This is the primary restore method that all restore methods fall back on.
     * It executes the restore for the node in a separate transaction and attempts to catch
     * the known conditions that can be reported back to the client.
     */
    public RestoreNodeReport restoreArchivedNode(
            final NodeRef archivedNodeRef,
            final NodeRef destinationNodeRef,
            final QName assocTypeQName,
            final QName assocQName)
    {
        RestoreNodeReport report = new RestoreNodeReport(archivedNodeRef);
        report.setTargetParentNodeRef(destinationNodeRef);
        try
        {
            // Transactional wrapper to attempt the restore
            RetryingTransactionHelper txnHelper = transactionService.getRetryingTransactionHelper();
            RetryingTransactionCallback restoreCallback = new RetryingTransactionCallback()
            {
                public NodeRef execute() throws Exception
                {
                    return nodeService.restoreNode(archivedNodeRef, destinationNodeRef, assocTypeQName, assocQName);
                }
            };
            NodeRef newNodeRef = txnHelper.doInTransaction(restoreCallback, false, true);
            // success
            report.setRestoredNodeRef(newNodeRef);
            report.setStatus(RestoreStatus.SUCCESS);
        }
        catch (InvalidNodeRefException e)
        {
            report.setCause(e);
            NodeRef invalidNodeRef = e.getNodeRef();
            if (archivedNodeRef.equals(invalidNodeRef))
            {
                // not too serious, but the node to archive is missing
                report.setStatus(RestoreStatus.FAILURE_INVALID_ARCHIVE_NODE);
            }
            else if (EqualsHelper.nullSafeEquals(destinationNodeRef, invalidNodeRef))
            {
                report.setStatus(RestoreStatus.FAILURE_INVALID_PARENT);
            }
            else if (destinationNodeRef == null)
            {
                // get the original parent of the archived node
                ChildAssociationRef originalParentAssocRef = (ChildAssociationRef) nodeService.getProperty(
                        archivedNodeRef,
                        ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC);
                NodeRef originalParentNodeRef = originalParentAssocRef.getParentRef();
                if (EqualsHelper.nullSafeEquals(originalParentNodeRef, invalidNodeRef))
                {
                    report.setStatus(RestoreStatus.FAILURE_INVALID_PARENT);
                }
                else
                {
                    // some other invalid node was detected
                    report.setStatus(RestoreStatus.FAILURE_OTHER);
                }
            }
            else
            {
                // some other invalid node was detected
                report.setStatus(RestoreStatus.FAILURE_OTHER);
            }
        }
        catch (AccessDeniedException e)
        {
            report.setCause(e);
            report.setStatus(RestoreStatus.FAILURE_PERMISSION);
        }
        catch (Throwable e)
        {
            report.setCause(e);
            report.setStatus(RestoreStatus.FAILURE_OTHER);
            logger.error("An unhandled exception stopped the restore", e);
        }
        // done
        if (logger.isDebugEnabled())
        {
            logger.debug("Attempted node restore: "+ report);
        }
        return report;
    }

    /**
     * @see #restoreArchivedNode(NodeRef, NodeRef, QName, QName)
     */
    public RestoreNodeReport restoreArchivedNode(NodeRef archivedNodeRef)
    {
        return restoreArchivedNode(archivedNodeRef, null, null, null);
    }

    /**
     * @see #restoreArchivedNodes(List, NodeRef, QName, QName)
     */
    public List restoreArchivedNodes(List archivedNodeRefs)
    {
        return restoreArchivedNodes(archivedNodeRefs, null, null, null);
    }

    /**
     * @see #restoreArchivedNode(NodeRef, NodeRef, QName, QName)
     */
    public List restoreArchivedNodes(
            List archivedNodeRefs,
            NodeRef destinationNodeRef,
            QName assocTypeQName,
            QName assocQName)
    {
        List results = new ArrayList(archivedNodeRefs.size());
        for (NodeRef nodeRef : archivedNodeRefs)
        {
            RestoreNodeReport result = restoreArchivedNode(nodeRef, destinationNodeRef, assocTypeQName, assocQName);
            results.add(result);
        }
        return results;
    }

    /**
     * Uses batch processing and job locking to purge all archived nodes
     */
    public List restoreAllArchivedNodes(StoreRef originalStoreRef)
    {
        final String user = AuthenticationUtil.getFullyAuthenticatedUser();
        if (user == null)
        {
            throw new IllegalStateException("Cannot restore as there is no authenticated user.");
        }
        
        final List results = Collections.synchronizedList(new ArrayList(1000));
        /**
         * Worker that purges each node
         */
        BatchProcessWorker worker = new BatchProcessor.BatchProcessWorkerAdaptor()
        {
            public void process(NodeRef entry) throws Throwable
            {
                AuthenticationUtil.pushAuthentication();
                try
                {
                    AuthenticationUtil.setFullyAuthenticatedUser(user);
                    if (nodeService.exists(entry))
                    {
                        RestoreNodeReport report = restoreArchivedNode(entry);
                        // Append the results (it is synchronized)
                        results.add(report);
                    }
                }
                finally
                {
                    AuthenticationUtil.popAuthentication();
                }
            }
        };
        doBulkOperation(user, originalStoreRef, worker);
        return results;
    }

    /**
     * Finds the archive location for nodes that were deleted from the given store
     * and attempt to restore each node.
     * 
     * @see NodeService#getStoreArchiveNode(StoreRef)
     * @see #restoreArchivedNode(NodeRef, NodeRef, QName, QName)
     */
    public List restoreAllArchivedNodes(
            StoreRef originalStoreRef,
            NodeRef destinationNodeRef,
            QName assocTypeQName,
            QName assocQName)
    {
        // get all archived children using a search
        ResultSet rs = getArchivedNodes(originalStoreRef, 0, -1);
        try
        {
            // loop through the resultset and attempt to restore all the nodes
            List results = new ArrayList(1000);
            for (ResultSetRow row : rs)
            {
                NodeRef archivedNodeRef = row.getNodeRef();
                RestoreNodeReport result = restoreArchivedNode(archivedNodeRef, destinationNodeRef, assocTypeQName, assocQName);
                results.add(result);
            }
            // done
            if (logger.isDebugEnabled())
            {
                logger.debug("Restored " + results.size() + " nodes into store " + originalStoreRef);
            }
            return results;
        }
        finally
        {
            rs.close();
        }
    }

    /**
     * This is the primary purge methd that all purge methods fall back on.  It isolates the delete
     * work in a new transaction.
     */
    public void purgeArchivedNode(final NodeRef archivedNodeRef)
    {
        RetryingTransactionHelper txnHelper = transactionService.getRetryingTransactionHelper();
        RetryingTransactionCallback deleteCallback = new RetryingTransactionCallback()         {             public Object execute() throws Exception             {                 try                 {                     nodeService.deleteNode(archivedNodeRef);                 }                 catch (InvalidNodeRefException e)                 {                     // ignore                 }                 return null;             }         };         txnHelper.doInTransaction(deleteCallback, false, true);     }      /**      * @see #purgeArchivedNode(NodeRef)      */     public void purgeArchivedNodes(List archivedNodes)     {         for (NodeRef archivedNodeRef : archivedNodes)         {             purgeArchivedNode(archivedNodeRef);         }         // done     }      /**      * Uses batch processing and job locking to purge all archived nodes      */     public void purgeAllArchivedNodes(StoreRef originalStoreRef)     {         final String user = AuthenticationUtil.getFullyAuthenticatedUser();         if (user == null)         {             throw new IllegalStateException("Cannot purge as there is no authenticated user.");         }                  /**          * Worker that purges each node          */         BatchProcessWorker worker = new BatchProcessor.BatchProcessWorkerAdaptor()         {             public void process(NodeRef entry) throws Throwable             {                 AuthenticationUtil.pushAuthentication();                 try                 {                     AuthenticationUtil.setFullyAuthenticatedUser(user);                     if (nodeService.exists(entry))                     {                         nodeService.deleteNode(entry);                     }                 }                 finally                 {                     AuthenticationUtil.popAuthentication();                 }             }         };         doBulkOperation(user, originalStoreRef, worker);     }          /**      * Do batch-controlled work      */     private void doBulkOperation(final String user, StoreRef originalStoreRef, BatchProcessWorker worker)     {         String lockToken = null;         try         {             // Get a lock to keep refreshing             lockToken = jobLockService.getLock(LOCK_QNAME, LOCK_TTL);             // TODO: Should merely trigger a background job i.e. perhaps it should not be             //       triggered by a user-based thread             BatchProcessor batchProcessor = new BatchProcessor(                     "ArchiveBulkPurgeOrRestore",                     transactionService.getRetryingTransactionHelper(),                     getArchivedNodesWorkProvider(originalStoreRef, lockToken),                     2, 20,                     null, null, 1000);             batchProcessor.process(worker, true);         }         catch (LockAcquisitionException e)         {             throw new AlfrescoRuntimeException(MSG_BUSY);         }         finally         {             try             {                 if (lockToken != null ) {jobLockService.releaseLock(lockToken, LOCK_QNAME); }             }             catch (LockAcquisitionException e)             {                 // Ignore             }         }     } }

星期三, 12月 29, 2010

[Alfresco] TrashcanDialog.java

印出lucene query string的結果,方便追踨。


Print Var.
Repository.getStoreRef():

workspace://SpacesStore

property.getArchiveRootRef():
archive://SpacesStore/20f1f650-07d2-4a93-b464-ac8e9f5ecf59

getArchiveRootRef().getStoreRef()
archive://SpacesStore

private final static String NAME_ATTR = Repository.escapeQName(ContentModel.PROP_NAME);
\{http\://www.alfresco.org/model/content/1.0\}name


private final static String USER_ATTR = Repository.escapeQName(ContentModel.PROP_ARCHIVED_BY);
\{http\://www.alfresco.org/model/system/1.0\}archivedBy


private final static String DATE_ATTR = Repository.escapeQName(ContentModel.PROP_ARCHIVED_DATE);
\{http\://www.alfresco.org/model/system/1.0\}archivedDate


System.out.println(ContentModel.PROP_NAME);
{http://www.alfresco.org/model/content/1.0}name

System.out.println(ContentModel.PROP_ARCHIVED_BY);
{http://www.alfresco.org/model/system/1.0}archivedBy

System.out.println(ContentModel.PROP_ARCHIVED_DATE); 
{http://www.alfresco.org/model/system/1.0}archivedDate

property.getArchiveRootRef():
      archive://SpacesStore/20f1f650-07d2-4a93-b464-ac8e9f5ecf59

Search Filter Rule:

search for ALL items in the archive store:
       PARENT:"archive://SpacesStore/20f1f650-07d2-4a93-b464-ac8e9f5ecf59" AND ASPECT:"{http://www.alfresco.org/model/system/1.0}archived"

search for user 
@\{http\://www.alfresco.org/model/system/1.0\}archivedBy:test1 AND PARENT:"archive://SpacesStore/20f1f650-07d2-4a93-b464-ac8e9f5ecf59" AND ASPECT:"{http://www.alfresco.org/model/system/1.0}archived"

search for user & today
@\{http\://www.alfresco.org/model/system/1.0\}archivedDate:[2010\-12\-30T00\:00\:00 TO 2010\-12\-30T14\:10\:41] AND @\{http\://www.alfresco.org/model/system/1.0\}archivedBy:test1 AND PARENT:"archive://SpacesStore/20f1f650-07d2-4a93-b464-ac8e9f5ecf59" AND ASPECT:"{http://www.alfresco.org/model/system/1.0}archived"

search for user & last 7 today
@\{http\://www.alfresco.org/model/system/1.0\}archivedDate:[2010\-12\-23T14\:12\:13 TO 2010\-12\-30T14\:12\:13] AND @\{http\://www.alfresco.org/model/system/1.0\}archivedBy:test1 AND PARENT:"archive://SpacesStore/20f1f650-07d2-4a93-b464-ac8e9f5ecf59" AND ASPECT:"{http://www.alfresco.org/model/system/1.0}archived"

Reference:
NodeArchiveService
Archive Store Lucene query
Calling Alfresco Web Services from C# 
TrashcanDialog.java  (source code)

[Alfresco] Lucene Language Note

Lucene Language

This is the recommended language as it is supported by the recommended indexer.
The query language is described on the Lucene site http://lucene.apache.org/java/2_4_0/queryparsersyntax.html. The QueryParser has been modified to allow wild cards at the start of wild card query elements otherwise the syntax is the same.
Note that certain characters need to be escaped in the query string. There is support to do this on a static method on the LuceneQueryParser.
The following fields are available

[Windows] Route

路由設定Command
ROUTE [-f] [-p] [-4|-6] command [destination]
                  [MASK netmask]  [gateway] [METRIC metric]  [IF inter

  -f           清除所有閘道項目的路由表。如果這與其中
               一個命令一起使用,將會在執行命令之前
               清除表格。

  -p           與 ADD 命令一起使用時,路由在系統開機期間
               可持續。依預設,系統重新啟動時並不會
               保留路由。對於會影響適當的持續路由的
               所有其他命令則會略過。Windows 95
               中不支援此選項。

  -4           強制使用 IPv4。

  -6           強制使用 IPv6。

  command      下列其中一個:
                 PRINT     列印路由
                 ADD       新增路由
                 DELETE    刪除路由
                 CHANGE    修改現有的路由
  destination  指定主機。
  MASK         指定下一個參數是 'netmask' 值。
  netmask      指定此路由項目的子網路遮罩值。
               如果沒有指定,將預設為 255.255.255.255。
  gateway      指定閘道。
  interface    指定之路由的介面號碼。
  METRIC       指定計量,例如目的地的成本。

目的地使用的所有符號名稱將會在網路資料庫檔案 NETWORKS
中查詢。閘道的符號名稱是在主機名稱資料庫檔案 HOSTS 中查詢。

如果是 PRINT 或 DELETE 命令,目的地或閘道可以是萬用字元
(指定星號 '*' 為萬用字元),或可以省略閘道引數。

如果目的地包含 * 或 ?,便會視為殼層模式,且只會列出相符的
目的地路由。'*' 表示與任何字串相符,
而 '?' 表示與任何一個字元相符。範例: 157.*.1, 157.*, 127.*, *224*。

只有 PRINT 命令才允許模式對應。
診斷注意事項:
    不正確的 MASK 會產生錯誤,例如當 (DEST & MASK) != DEST 時。
    範例> route ADD 157.0.0.0 MASK 155.0.0.0 157.55.80.1 IF 1
          路由新增失敗: 指定的遮罩參數不正確。
(Destination & Mask) != Destination。

範例:

    > route PRINT
    > route PRINT -4
    > route PRINT -6
    > route PRINT 157*          ....只列印符合 157* 的項目

    > route ADD 157.0.0.0 MASK 255.0.0.0  157.55.80.1 METRIC 3 IF 2
                   目的地^      ^遮罩      ^閘道            計量^    ^
                                                               介面^
      如果沒有指定 IF,將會嘗試為指定的閘道尋找最佳的介面。
    > route ADD 3ffe::/32 3ffe::1

    > route CHANGE 157.0.0.0 MASK 255.0.0.0 157.55.80.5 METRIC 2 IF 2

      CHANGE 只用來修改閘道及 (或) 計量。

    > route DELETE 157.0.0.0
    > route DELETE 3ffe::/32


Testing:
route add 10.15.3.97 mask 255.255.255.255 192.168.123.1 (gateway:vpn route ip)

星期五, 12月 24, 2010

[Alfresco] 目錄


Alfresco的檔案放置目錄結構,此版本為3.4.5

../alf_data
        /audit.contentstore
        /backup-lucene-indexes
        /contentstore
        /contentstore.deleted (deleted objects)
        /lucene-indexes

星期四, 12月 16, 2010

[Alfresco WebService]Ticket could not be found when calling callback handler

三種解法Aflreso Webserver login後Ticket有時候會無法正常取得的方法:

1 - start new session for for every separate thread.
2 - store authenticationDetails in the user's session, and use it to call the webservice

登入後使用session keep AuthenticationDetails 物件
AuthenticationUtils.startSession("user", "password");
    request.getSession().setAttribute("authenticationDetails", AuthenticationUtils.getAuthenticationDetails());
每次呼叫WebService時,把session中的AuthenticationDetails在設定回去
AuthenticationUtils.setAuthenticationDetails((AuthenticationDetails) req.getSession().getAttribute("authenticationDetails"));
Node[] nodes = repositoryService.get(new Predicate(null,spacesStore, qt));

3 - Modify AuthenticationUtils to store authenticationDetails in session instead of ThreadLocal, rebuild the SDK.

Reference:
Ticket could not be found when calling callback handler

星期二, 12月 14, 2010

[Wordpress] posts 相關


wp_posts table
--post_status:inherit,draft,publish,trash,auto-draft,pending
--post_type:attachment,nav_menu_item,page,post,revision


























星期二, 12月 07, 2010

[ZK] borderlayout Executions.createComponents

目前jsp頁面使用borderlayout zk tag遇到的問題
直接call jsp file 會出現"org.xml.sax.SAXParseException: The markup in the document preceding the root element must be well-formed."

有人提到的解法



你不能用Executions.createComponents來做,必須用一個include Component 或 iframe component 以setSrc的方式來操作。

星期一, 12月 06, 2010

[Java] Java如何讀取與寫入properties file Reading and Writing a Properties File

Properties properties = new Properties();
try {
properties.load(new FileInputStream("filename.properties"));
} catch (IOException e) {
}

// Write properties file.
try {
properties.store(new FileOutputStream("filename.properties"), null);
} catch (IOException e) {


上面寫法路徑一直讓我讀不到,採用package path是正確可以讀到的

資源的package path:local.my.properties
String repositoryLocation = null;
// create an instance of properties class
Properties props = new Properties();
URL url = Thread.currentThread().getContextClassLoader().getResource("local/my.properties");
try {
props.load(url.openStream());
// props.load(in);
repositoryLocation = props.getProperty(propertyName);
System.out.println("property:" + repositoryLocation);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return repositoryLocation;

後記:2012/03/22
使用以上作法會造成to many file open的議題產生(開檔後未關檔),不應該每要一個屬性就開properties檔案一次。可參考以下解法:
loading properties file from java package
When loading the Properties from a Class in the package com.al.common.email.templates you can use
Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close()
(Add all the necessary exception handling).
If your class is not in that package, you need to aquire the InputStream slightly differently:
InputStream in = getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");
Relative paths (those without a leading '/') in getResource()/getResourceAsStream() mean that the resource will be searched relative to the directory which represents the package the class is in.
Using java.lang.String.class.getResource("foo.txt") would search for the (inexistent) file/java/lang/String/foo.txt on the classpath.
Using an absolute path (one that starts with '/') means that the current package is ignored.

Reference:
Java Properties file examples

[Asp.Net] 将截断字符串或二进制数据。 语句已终止。

将截断字符串或二进制数据。语句已终止。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。
语句已终止。


今天page執行sp產生的以上的錯誤訊息(架在簡體的機器上Orz),原來是sp裡面插入暫存table所宣告的欄位長度過小而引起的錯誤。

星期日, 12月 05, 2010

[Asp.Net] URL Rewrite 懶人包心得

記錄使用rewrite相關問題解法。
最後使用免費的套件來ISAPIRewrite處理
(如有其他需求可參考這篇Tip/Trick: Url Rewriting with ASP.NET )
不過順利解決完rewrite的問題後。
又遇到二個問題需要處理lol~不過解法都在找到的資料裡面,
以下只是記錄一下流程跟心得:)

星期五, 12月 03, 2010

[CSS] 解決div無法滿版的問題

修正DOCTYPE xhtml DIV無法滿版的問題,請加入以下語法。
html, body { margin: 0; padding: 0; height: 100%; border:none; }
之後的div內的heigth:100%就可以正常

Reference:
TIPS-Get 100% Height in XHTML

星期三, 12月 01, 2010

A Coder’s Guide to Writing API Documentation

A Coder’s Guide to Writing API Documentation

Peter Gruenbaum

Ever been in a situation where your manager asks you to write documentation for the APIs that you developed? Let’s face it, if you’re like most developers, you love to code and hate to write. Furthermore, writing takes time away from critical tasks you need to do, such as feature development and bug fixing.
It’s no surprise that API documentation often ends up being frustrating and confusing for the reader—it rarely gets the attention it deserves.
This article is a guide on how to write API documentation. I’ll describe the most important components of API documentation and provide some suggestions about how to make it effective. I’ll also give you some hints for creating good overviews, sample code and reference material, including where you should focus your time and attention to get the best effect.

其他你感興趣的文章

Related Posts with Thumbnails